angularjs resource基于请求主体的身份验证标头

时间:2013-07-10 11:46:14

标签: angularjs header hmac

我正在尝试将Resource与受HMAC身份验证方法保护的API一起使用。所以我需要在请求中附加“身份验证”标题。

在此示例代码中,我使用GET从API获取文章,并使用“update”自定义方法更新它。对于更新,我需要身份验证标头。问题是,当我定义标题时,$scope.articleundefined

getAuth函数计算符号。

建议?

function EditCtrl($scope,$resource,articleId) {
    var Article = $resource('/blog/articles/:articleId',
    {articleId:articleId}, {
        update: {
            method:'PUT',
            headers: {Authentication: getAuth('key','PUT','/blog/articles/'+articleId,$scope.article)}
        }
    });

    var article = Article.get();
    $scope.article = article;

    $scope.save = function(){
        article.$update();
    }
}

function getAuth(key,verb,resource,data) {
    //data is undefined there

    content_md5 = CryptoJS.MD5(JSON.stringify(data));
    message = verb+'\n'+resource+'\n'+content_md5;
    hash = CryptoJS.HmacSHA512(message, key);

    var sign = "AuthHMAC 0123456789:"+hash.toString(CryptoJS.enc.Base64);

    return sign;
}

4 个答案:

答案 0 :(得分:0)

我使用三个元素改进了Alan的解决方案:

  • 共享密钥的工厂服务
  • 发送httpRequest的控制器
  • 设置标题的httpRequestInterceptor

控制器调用由计算标头的工厂服务提供的setKey()。最后,httpResponseInterceptor设置由工厂服务提供的请求调用getKey()的标头。

解决!

答案 1 :(得分:0)

我正在研究类似的东西。

我相信答案在于使用$ httpProvider.defaults.transformRequest函数,我还没有完成它,但是文档中描述的基础知识:http://docs.angularjs.org/api/ng。$ http

我认为是这样的:

var authModule = angular.module('my.AuthModule', [], myAuthModuleCfg);

function myAuthModuleCfg($httpProvider) {
    $httpProvider.defaults.transformRequest.push(myRequestSigner)
}

function myRequestSigner(data, headersGetter) {
    // do some signing, etc...
}

答案 2 :(得分:0)

(仅发布链接而不是整个解决方案的道歉)在GitHub(MIT许可证)上查看'Monofraps's angular-node-hmac-example

对于Hmac / SHA512加密,它使用(已弃用)CryptoJS library,我可能会替换Forge cryptographic libraryCryptoJS现已被放弃)。

答案 3 :(得分:-1)

我还没有尝试过,但如果你看一下较低级别的API $http,它有一个方法可以将config作为参数。我认为此配置包含您在发出请求之前可以更新的headers属性。这是PUT的签名

$http.put(url, data, config)