3

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

在此示例代码中,我使用 GET 从 API 获取文章,并使用“更新”自定义方法对其进行更新。对于更新,我需要 Authentication 标头。问题是$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

4 回答 4

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...
}
于 2013-09-20T00:02:03.123 回答
0

(抱歉只发布链接而不是整个解决方案)查看GitHub 上的“Monofraps 的angular-node-hmac-example ”(MIT 许可证)。

对于 Hmac/SHA512 加密,它使用(已弃用)CryptoJS 库,我可能会将其换成Forge 加密库CryptoJS现在已被放弃)。

于 2014-07-07T14:21:44.983 回答
0

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

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

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

解决了!

于 2013-07-11T09:42:14.100 回答
-1

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

$http.put(url, data, config)

于 2013-07-10T12:35:46.383 回答