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/html
的GET /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.send
、res.redirect
等expressjs.com/api.html,而不是res.json
以上是关于AngularJS 拦截器没有将 JWT Bearer 放入 node.js 应用程序的每个请求中的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 AngularJS 传递 JsonWebToken(JWT)
angularjs拦截器:为啥在$http拦截器中没有收到正确的状态码和消息