AngularJS 拦截器没有将 JWT Bearer 放入 node.js 应用程序的每个请求中

Posted

技术标签:

【中文标题】AngularJS 拦截器没有将 JWT Bearer 放入 node.js 应用程序的每个请求中【英文标题】:AngularJS interceptor not putting JWT Bearer in every request of node.js app 【发布时间】:2015-06-28 17:22:35 【问题描述】:

我在一个节点应用程序中放置了一个 JWT 身份验证系统。

我使用拦截器将 Bearer 放入每个请求中。如果我在 Angular 中调用受限路由,或者如果我 curl 并在标头中指定令牌,它会很好地工作。 但是如果我直接在地址栏中输入受限路线,它就不起作用了。头部没有Bearer,不经过拦截器。

这是我的拦截器(客户端):

angular.module('myApp).factory('authInterceptor', function ($rootScope, $q, $window) 
  return 
    request: function (config) 
      config.headers = config.headers || ;
      if ($window.localStorage.token) 
        config.headers.Authorization = 'Bearer ' + $window.localStorage.token;
      
      return config;
    ,
    responseError: function (rejection) 
      if (rejection.status === 401) 
        // handle the case where the user is not authenticated
      
      return $q.reject(rejection);
    
  ;
);
angular.module('myApp').config(function ($httpProvider) 
  $httpProvider.interceptors.push('authInterceptor');
);

这是我的受限路线(服务器端):

router.get('/restricted', expressJwt(secret: 'SecretStory'), function(req, res) 
  res.json(
      name: 'You are allowed here !!'
    );
)

如何在每个请求中将承载添加到我的请求标头中,即使直接在地址栏中输入受限路由?

【问题讨论】:

【参考方案1】:

当您直接在地址栏中输入 URL 时,您正在绕过您的 Angular 代码,正如您所发现的,拦截器不会运行。

可以尝试detecting when the URL in the address bar changes 并尝试解决该问题,但我建议不要这样做。

相反,我将通过检测带有Accept 标头text/htmlGET /restricted 请求(实际上不是application/json)来解决此问题。然后使用包含您的 Angular 代码的 HTML 进行响应,并在页面加载时再次使用 application/json 请求 /restricted。这将是区分显式 URL 导航和 Angular 请求的好方法,并为您的 API 提供更好的超媒体支持。

【讨论】:

好的,我知道你的解决方案是什么。但我不知道是否有可能实现它。如果我检测到accept header:router.get('/restricted', expressJwt(secret: secret) , function(req, res) if (req.headers["accept-language"] != 'application/json') //Called from URL navigation res.json( name: 'You are allowed here !!' ); ) 是在jwt验证之后,我认为在jwt验证之前,同一条路由不可能有不同的行为。 你可以打电话给res.sendres.redirect等expressjs.com/api.html,而不是res.json

以上是关于AngularJS 拦截器没有将 JWT Bearer 放入 node.js 应用程序的每个请求中的主要内容,如果未能解决你的问题,请参考以下文章

浏览器中直接 URL 命中的 Jwt 令牌身份验证

如何通过 AngularJS 传递 JsonWebToken(JWT)

angularjs拦截器:为啥在$http拦截器中没有收到正确的状态码和消息

如果刷新(JWT)令牌未经授权(401响应),AngularJS重定向到登录

JWT 授权 laravel / angularjs 问题

带有 JWT 的 AngularJS 或 SPA - 到期和刷新