我正在开展角度项目。当我登录到应用程序时,我将从登录服务收到的access_token保存到$ cookies。这个access_token在2分钟后到期。 登录后,对于子请求功能,我必须使用$ http将此access_token发送到服务以获得有效响应。 一旦此access_token在2分钟后到期,我将调用一个服务,该服务将重新生成access_token并再次保存在$ cookies中。 如果没有access_token,我的其他功能将无法正常工作。
基本上我需要在应用程序中的每次服务调用之前检查$ cookies中是否存在访问令牌。如果访问令牌不存在,则需要使用$ http通过另一个服务调用重新生成它,并将其保存回cookie中,然后将该功能的服务调用保存。如果存在访问令牌,则执行所需的服务调用。
我的功能之一是:
mPosController.controller('offerController', ['$scope', '$route', '$cookies', '$rootScope', 'mosServiceFactory', 'ngDialog', '$modal', '$q', function ($scope, $route, $cookies, $rootScope, mosServiceFactory, ngDialog, $modal, $q) {
mosServiceFactory.viewAllOffers('page=0').then(function (data) {
//Do the desire functionality
});
}]);
我的服务是:
mPosServices.factory('mosServiceFactory', function ($http, $rootScope, $cookies,$q) {
return{
viewAllOffers: function (page) {
var allOffers = $http({
method: "get",
url: "myserviceurl?enrollmentId=" + $rootScope.enrollMentId + "&" + page + "&size=10&access_token=" + $cookies.get('access_token'),
});
return allOffers;
},
refresh_token: function () {
var refreshToken = $http({
method: "get",
url: "myserviceurl/oauth/token?grant_type=refresh_token&client_id=restapp&client_secret=restapp&refresh_token=" + $cookies.get('refresh_token'),
})
return refreshToken;
},
}
});
所以在调用viewAllOffers()之前,我需要检查$ cookies中是否存在access_token,如果不是则调用refresh_token服务。
我如何实现这一目标?
答案 0 :(得分:2)
基本上我需要检查$ cookies中是否存在访问令牌 在应用程序中的每个服务调用之前。如果没有访问令牌 现在,然后需要再生它..
..我如何实现这一点?
在进行任何 interceptor
来电之前,您只需创建access_token
即可检查Cookie中是否存在$http
。您需要添加use $injector
以在拦截器内获取mosServiceFactory
实例。
mPosServices.service('APIInterceptor', ['$injector', '$cookies', function($injector, $cookies) {
var service = this;
service.request = function(config) {
if (!$cookies.get('access_token') && config.url.indexOf('myservice/oauth/token?grant_type=') === -1) {
return $injector.get('mosServiceFactory').refresh_token().then(function(response) {
var date = new Date();
date.setTime(date.getTime() + (response.data.expiresIn * 1000));
$cookies.remove('access_token');
$cookies.put('access_token', response.data.value, {
expires: date
});
$cookies.put('refresh_token', response.data.refreshToken.value);
}).then(function() {
return config; // <-- token is refreshed, reissue original request
});
}
return config;
};
service.responseError = function(response) {
return response;
};
}]);
APIInterceptor
将监控使用$http
服务发出的所有请求,执行先决条件操作(,如重新生成access_token )并拦截任何响应错误。
你需要将拦截器推到$httpProvider
函数的config
。
module.config(['$httpProvider', function($httpProvider) {
$httpProvider.interceptors.push('sessionInjector');
}]);
编辑:由于对refresh_token
的请求也在使用$http
服务,因此会出现循环依赖性错误。这是因为每当你发现$cookies.get('access_token')
为空时,拦截器将尝试从mosServiceFactory.refresh_token()
获取一个新的令牌,这将再次带来拦截器。为避免这种情况,您需要在APIInterceptor
内进行检查,以便在grant_type !='refresh_token'