当前位置: 首页 > 面试题库 >

AngularJS:如何使用$ resource请求发送身份验证令牌?

隆璞
2023-03-14
问题内容

我想从我的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#控制台应用程序发送消息推送并在我的手机上接收它(我认为,授权密钥是正确的): 问题:如何