我正在使用此博客中的代码来为我的角度应用程序创建身份验证模块。
我有一个测试页,其中包括一个登录表单,一个提交按钮和一个“配置文件”按钮,这些按钮将查询受限制的路线。
<div class="container-fluid" ng-controller="AuthCtrl as auth">
<input type="text" ng-model="auth.user.username">
<input type="text" ng-model="auth.user.password">
<button ng-click="auth.login(auth.user)">LOGIN</button>
<button ng-click="auth.profile()">PROFILE</button>
</div>
登录后查询的受限路由定义为:
const authenticate = expressJwt({
secret: SECRET
});
app.get('/me', authenticate, function(req, res) {
res.status(200).json(req.user);
});
登录正常。我收到放置在sessionStorage中的令牌。当我单击配置文件按钮(对/ me的请求)时,出现未经授权的错误。
如果刷新页面并再次单击个人资料,我确实会得到预期的行为。(/ me返回用户数据,没有错误)
如果此后手动删除令牌,在刷新页面之前,我仍然可以访问/ me。
这是我的服务:
function loginService($http) {
this.login = function(user) {
return $http.post('/auth', user).then(
function(response) {
return response.data;
},
function(response) {
return response;
});
};
this.profile = function() {
return $http.get('/me').then(
function(response) {
return response.data;
},
function(response) {
return response;
});
};
}
angular
.module('app')
.service('loginService', loginService);
这是我与httpProvider的控制器:
function AuthCtrl($window, $http, loginService) {
this.user = {username: "", password: ""};
this.login = function(user) {
loginService.login(user).then(function(data) {
$window.sessionStorage.token = data.token;
});
};
this.profile = function() {
loginService.profile().then(function(data) {
console.log(data);
});
};
}
function config($httpProvider, $windowProvider) {
var window = $windowProvider.$get();
if(window.sessionStorage.token) {
var token = window.sessionStorage.token;
$httpProvider.defaults.headers.common.Authorization = 'Bearer ' + token;
}
};
angular
.module('app')
.config(config)
.controller('AuthCtrl', AuthCtrl);
问题可能出自将令牌存储在sessionStorage中还是来自http提供程序?
最终,我将实现安全cookie方法,但是在继续进行之前,我想解决这一问题。
我终于弄清楚了$httpProvider
代码即将到来。
function config($httpProvider, $windowProvider) {
var window = $windowProvider.$get();
if(window.sessionStorage.token) {
var token = window.sessionStorage.token;
$httpProvider.defaults.headers.common.Authorization = 'Bearer ' + token;
}
};
提供程序选项在应用程序加载期间仅设置一次。重新加载页面将重新运行配置代码,if(window.sessionStorage.token)
并按预期输入条件。
为了使此配置动态,我必须创建一个拦截器(工厂),如下所示:
function config($httpProvider) {
$httpProvider.interceptors.push('authInterceptor');
};
function authInterceptor($rootScope, $q, $window) {
return {
request: function (config) {
config.headers = config.headers || {};
if ($window.sessionStorage.token) {
config.headers.Authorization = 'Bearer ' + $window.sessionStorage.token;
}
return config;
},
responseError: function (rejection) {
if (rejection.status === 401) {
console.log("not authorised");
}
return $q.reject(rejection);
}
};
};
angular
.module('app')
.config(config)
.controller('AuthCtrl', AuthCtrl)
.factory('authInterceptor', authInterceptor);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句