【发布时间】:2015-03-24 16:12:32
【问题描述】:
我正在尝试为我的 nodejs、express 和 angularjs 应用程序实现 jwt 身份验证。到目前为止,我已经生成了令牌,并将其存储在我的localStorage 中。根据this教程,我在angular factory中实现了authInterceptor如下:
app.factory('authInterceptor', function ($rootScope, $q, $window) {
return {
request: function (config) {
config.headers = config.headers || {};
if ($window.localStorage.myToken) {
config.headers.Authorization = 'Bearer ' + $window.localStorage.myToken;
}
return config;
},
response: function (response) {
if (response.status === "401") {
$window.location.replace('/dash');
}
return response || $q.when(response);
}
};
});
我已经在配置文件中推送了拦截器,如下:
$httpProvider.interceptors.push('authInterceptor');
到目前为止,我已将凭据发送到服务器、生成令牌并将其存储在 localStorage 中。
所以只要我没有从localStorage中删除令牌,并且令牌没有过期,我认为它应该是持久的。如果我使用 angularjs 的后台 ajax 调用从加载的页面中发出请求,则会按预期设置身份验证标头。
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiYSIsInR5cGUiOiJzYWxlcyIsImlhdCI6MTQyMjI2MDExMCwiZXhwIjoxNDIyMjc4MTEwfQ.Iv6W-Tc8Qm4FGclzmgbtjvWFz_tyDwEvrFmMmucONpY
但是,当我导航到新路线时,我的请求和响应都没有被拦截。例如,我有我的“/销售”路线。但是当我从地址栏导航到销售路由时,请求认证头都没有被拦截器设置,因此从服务器返回授权错误401,也没有被拦截;因此不会重定向到/dash。
这是错误的链接,以及 GET 请求的标头到未经授权的路由“/sales”:
【问题讨论】:
-
提示:你看过 responseError 吗?
-
NetworkError: 401 Unauthorized - http://localhost:9090/sales -
我很抱歉,我应该更清楚。在某种意义上: responseError: function(rejection) { if(rejection.status == 401){ //do something with path } }
-
这应该进入拦截器还是控制器内部?
-
它是拦截器的一部分,就像响应和请求一样。我使用 responseError 来检测我的状态是否为 401,然后在我的情况下将用户重定向到登录页面。
标签: angularjs node.js authentication jwt express-jwt