我正在尝试为我的nodejs,express和angularjs app实现jwt身份验证。到目前为止,我已经生成了令牌,并将其存储在我的localStorage
中。根据{{3}}教程,我在角度工厂中实现了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
但是,当我导航到新路线时,我的请求和我的回复都没有被截获。例如,我有我的' / sales'路线。但是当我从地址栏导航到销售路线时,拦截器都没有设置请求认证头,因此从服务器返回授权错误401,也没有截获;因此不会重定向到/dash
。
这是错误的链接,以及GET请求到未授权路由' / sales'的标题:
答案 0 :(得分:2)
你的后端是否发送了WWW-Authenticate
标题以及401状态?如果是,并且它包含Basic
,浏览器将捕获响应并在Angular捕获之前显示凭据弹出窗口。
尝试删除或更改它。
参考文献:
答案 1 :(得分:1)
到目前为止我所理解的是,通常在javascript前端框架之前如何提供http请求:
但是随着最近向各种javascript前端框架的转变以及RESTful api.s的使用已经开始,请求需要具有授权标头。因此,在许多具有javascript框架的单页网页应用程序中,例如angularjs,
因此,当从角度应用程序发出请求时,它会从角度应用程序中截取并被拦截器截获。但是,当从地址栏输入URL时,浏览器会直接向服务器发送请求,因为在请求的那一点,浏览器尚未加载角度Web应用程序。
我所做的是你将html5mode设置为false并在路线前放置#
。
与localhost/#/some-route
类似,并从路由提供商处进行路由。当您的路由前有#
时,/
的请求将转到服务器,应用程序加载,然后通过应用程序发送请求。现在从这个some-route
,让一些控制器向所需的服务器端点发出请求,该端点将被拦截器截获。