我想从我的API请求资源时发送身份验证令牌。
我确实使用$ resource实现了服务:
factory('Todo', ['$resource', function($resource) {
return $resource('http://localhost:port/todos.json', {port:":3001"} , {
query: {method: 'GET', isArray: true}
});
}])
我有一个存储身份验证令牌的服务:
factory('TokenHandler', function() {
var tokenHandler = {};
var token = "none";
tokenHandler.set = function( newToken ) {
token = newToken;
};
tokenHandler.get = function() {
return token;
};
return tokenHandler;
});
我想tokenHandler.get
通过Todo
服务发送的每个请求都发送令牌。通过将其放入特定动作的调用中,我能够发送它。例如,这有效:
Todo.query( {access_token : tokenHandler.get()} );
但是我宁愿将access_token定义为Todo
服务中的参数,因为它必须随每个调用一起发送。并提高干度。但是工厂中的所有内容仅执行一次,因此access_token在定义工厂之前必须是可用的,此后不能更改。
有没有办法将动态更新的请求参数放入服务中?
感谢Andy Joslin。我选择了他包装资源操作的想法。资源服务现在看起来像这样:
.factory('Todo', ['$resource', 'TokenHandler', function($resource, tokenHandler) {
var resource = $resource('http://localhost:port/todos/:id', {
port:":3001",
id:'@id'
}, {
update: {method: 'PUT'}
});
resource = tokenHandler.wrapActions( resource, ["query", "update"] );
return resource;
}])
如您所见,资源首先是按常规方式定义的。在我的示例中,这包括一个名为的自定义操作update
。之后,通过返回tokenHandler.wrapAction()
方法将资源覆盖,该方法将资源和一系列操作作为参数。
如您所料,后一种方法实际上包装了操作以在每个请求中包括auth令牌,并返回修改后的资源。因此,让我们看一下代码:
.factory('TokenHandler', function() {
var tokenHandler = {};
var token = "none";
tokenHandler.set = function( newToken ) {
token = newToken;
};
tokenHandler.get = function() {
return token;
};
// wrap given actions of a resource to send auth token with every
// request
tokenHandler.wrapActions = function( resource, actions ) {
// copy original resource
var wrappedResource = resource;
for (var i=0; i < actions.length; i++) {
tokenWrapper( wrappedResource, actions[i] );
};
// return modified copy of resource
return wrappedResource;
};
// wraps resource action to send request with auth token
var tokenWrapper = function( resource, action ) {
// copy original action
resource['_' + action] = resource[action];
// create new action wrapping the original and sending token
resource[action] = function( data, success, error){
return resource['_' + action](
angular.extend({}, data || {}, {access_token: tokenHandler.get()}),
success,
error
);
};
};
return tokenHandler;
});
如您所见,该wrapActions()
方法从其参数创建资源的副本,并遍历actions
数组tokenWrapper()
以为每个操作调用另一个html" target="_blank">函数。最后,它返回修改后的资源副本。
该tokenWrapper
方法首先创建一个预先存在的资源操作的副本。该副本下划线。如此query()
成为_query()
。之后,新方法将覆盖原始query()
方法。_query()
正如Andy
Joslin所建议的那样,此新方法将包装以为通过该操作发送的每个请求提供auth令牌。
这种方法的好处是,我们仍然可以使用每个angularjs资源(获取,查询,保存等)附带的预定义操作,而不必重新定义它们。在其余代码中(例如在控制器内),我们可以使用默认操作名称。
问题内容: 我一直在使用HTTPClient版本4.1.2尝试通过需要基本身份验证的HTTP API访问REST。这是客户端代码: 当我构造一个请求时,像这样: 我在Charles Proxy中 看到有两个请求正在发送。一个不带标题,另一个 带 标题。如您所料,第一个失败的原因是401,但是第二个失败的情况却是201。 有谁知道为什么会这样吗?谢谢! 编辑: 我应该明确指出,我已经看过这个问题了,
在查看了文档之后,我注意到没有一个GET方法接受头作为参数,发送头(如accept和Authorization)的唯一方法是使用exchange方法。 因为这是一个非常基本的动作,我想知道我是否遗漏了什么,还有另一个更容易的方法来做它?
我正在尝试向正在运行的本地服务器发出GET请求。我无法返回正确的数据,我看到“未经授权”的响应。如果字符串“token”是正确的,那么任何人都能发现任何明显的问题吗。 }* 我能够从命令行获得一个curl请求:
} 要获取令牌,我执行以下步骤: > 使用浏览器转到:http://localhost:9000/oauth/authorize?response_type=code&client_id=test&redirect_uri=http%3a%2f%2flocalhost%3a8080%2f&scope=write 首先,它将我重定向到一个登录表单,在那里我输入用户名和密码:admin abc 请帮我
我尝试从PHP向Android手机应用发送推送通知 我使用谷歌云消息,但在浏览器中我看到错误: 请求缺少身份验证密钥(FCM令牌)。请参阅FCM文档的“认证”部分,网址为https://firebase.google.com/docs/cloud-messaging/server.错误401 此外,我可以从c#控制台应用程序发送消息推送并在我的手机上接收它(我认为,授权密钥是正确的): 问题:如何