我正在尝试将Resource与受HMAC身份验证方法保护的API一起使用。所以我需要在请求中附加“身份验证”标题。
在此示例代码中,我使用GET从API获取文章,并使用“update”自定义方法更新它。对于更新,我需要身份验证标头。问题是,当我定义标题时,$scope.article
为undefined
。
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;
}
答案 0 :(得分:0)
我使用三个元素改进了Alan的解决方案:
控制器调用由计算标头的工厂服务提供的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 library(CryptoJS现已被放弃)。
答案 3 :(得分:-1)
我还没有尝试过,但如果你看一下较低级别的API $http
,它有一个方法可以将config作为参数。我认为此配置包含您在发出请求之前可以更新的headers
属性。这是PUT的签名
$http.put(url, data, config)