Javascript 刷新令牌是如何工作的,以及上次失败的http请求是如何再次调用的,它给出了401。。。?
我正在使用Javascript 刷新令牌是如何工作的,以及上次失败的http请求是如何再次调用的,它给出了401。。。?,javascript,angularjs,oauth-2.0,Javascript,Angularjs,Oauth 2.0,我正在使用angularjs使用OAuth2。现在我陷入了OAuth的身份验证中,无法重新发送最后一个401API。任何想法 我正在使用oauth2 repo Controller.js app.controller('validate', ['$scope', '$rootScope', '$location', 'fullname', '$http', '$timeout', '$cookies', 'OAuth', function ($scope, $rootScope, $locati
angularjs
使用OAuth2
。现在我陷入了OAuth的身份验证中,无法重新发送最后一个401API。任何想法
我正在使用oauth2 repo
Controller.js
app.controller('validate', ['$scope', '$rootScope', '$location', 'fullname', '$http', '$timeout', '$cookies', 'OAuth', function ($scope, $rootScope, $location, fullname, $http, $timeout, $cookies, OAuth) {
OAuth.getAccessToken($scope.user).then( function successCallBack(response){
$scope.response = response;
if($scope.response.status == 200){
console.log($scope.response.data);
$scope.accessToken = $scope.response.data.access_token;
$scope.refreshToken = $scope.response.data.refresh_token;
localStorage.setItem("accessToken", $scope.accessToken);
localStorage.setItem("refreshToken", $scope.refreshToken);
var userId = response.headers('userid');
console.log(userId);
$cookies.put("userId", userId);
window.location.href = 'user_profile.php';
}
}, function errorCallBack(response){
console.log(response);
});
}]);
app.js
app.config(['OAuthProvider', function(OAuthProvider) {
OAuthProvider.configure({
baseUrl: 'http://testzone.xxxxxx.net/api/LoginTest/Login/web/',
clientId: '123456789',
clientSecret: 'otszh9nonaosok88gsswc8k4w8ww04s',
grantPath: 'api/oauth2/token',
revokePath: 'api/oauth2/revoke'
});
}]);
app.run(['$rootScope', '$window', 'OAuth', '$cookies', '$timeout', function($rootScope, $window, OAuth, $cookies, $timeout) {
$rootScope.$on('oauth:error', function(event, rejection) {
// Ignore `invalid_grant` error - should be catched on `LoginController`.
if ('invalid_token' === rejection.data.error || 'invalid_grant' === rejection.data.error || 'invalid_request' === rejection.data.error || 'invalid_client' === rejection.data.error || 'unauthorized_client' === rejection.data.error || 'unsupported_grant_type' === rejection.data.error) {
$cookies.remove('userId');
$timeout(function(){
window.location.href = 'index.php';
},200);
}
// Refresh token when a `invalid_token` error occurs.
if ('expired_token' === rejection.data.error) {
console.log(rejection);
OAuth.getRefreshToken();
}
console.log(rejection);
console.log(rejection.data.error);
console.log(rejection.data.error_description);
// Redirect to `/login` with the `error_reason`.
//return $window.location.href = 'index.php';
});
}]);
谢谢
是一种特殊的refresh-token
,用于随时获取更新的JWT
id\u-token
- 刷新令牌携带获取新访问令牌所需的信息。换句话说,每当需要访问令牌来访问特定资源时,客户端可以使用刷新令牌来获取由认证服务器颁发的新访问令牌
看到这个相关的项目,你可以从中得到一些想法
是一种特殊的refresh-token
,用于随时获取更新的JWT
id\u-token
- 刷新令牌携带获取新访问令牌所需的信息。换句话说,每当需要访问令牌来访问特定资源时,客户端可以使用刷新令牌来获取由认证服务器颁发的新访问令牌
看到这个相关的项目,你可以从中得到一些想法 在分析错误响应时,可以执行以下操作:
if (rejection.status === 401) {
var authService = $injector.get('oAuthService');
var authData = ipCookie(oAuthConstants.oAuthCookieName);
var $http = $http || $injector.get('$http');
var deferred = $q.defer();
if (authData) {
authService.refreshToken().then(function () {
//this repeats the request with the original parameters
return deferred.resolve($http(rejection.config));
});
}
return deferred.promise;
}
else if (rejection.status === 403) {
var toaster = $injector.get('toaster');
toaster.pop('error', "Access Denied", "You are not authorized to do this request.");
}
else {
return $q.reject(rejection);
}
重复上次401 api调用的关键是:
return deferred.resolve($http(rejection.config));
我希望它能有所帮助。在分析错误响应时,您可以这样做:
if (rejection.status === 401) {
var authService = $injector.get('oAuthService');
var authData = ipCookie(oAuthConstants.oAuthCookieName);
var $http = $http || $injector.get('$http');
var deferred = $q.defer();
if (authData) {
authService.refreshToken().then(function () {
//this repeats the request with the original parameters
return deferred.resolve($http(rejection.config));
});
}
return deferred.promise;
}
else if (rejection.status === 403) {
var toaster = $injector.get('toaster');
toaster.pop('error', "Access Denied", "You are not authorized to do this request.");
}
else {
return $q.reject(rejection);
}
重复上次401 api调用的关键是:
return deferred.resolve($http(rejection.config));
我希望它能有所帮助。如果您想要的不仅仅是上述答案,而不是回复我我面临的问题是我无法再次发送最后一个401未经授权的请求。刷新令牌不需要是JWT。实际上,大多数情况下,它只是保存在服务器上的一个随机字符串(例如GUID)。如果您想要的不仅仅是上述答案,而不是回复方法。我面临的问题是,我无法再次发送最后一个401未经授权的请求。刷新令牌不需要是JWT。实际上,大多数情况下,它只是保存在服务器上的一个随机字符串(例如GUID)。这意味着您在第一个请求,你现在想解决它吗?是的,就在调用刷新令牌之后,现在我想再次请求之前的401 http…意味着我还想知道令牌身份验证的整个结构。你想知道
api流
,或者如何从刷新令牌
生成accesstoken
?第二,如果这篇文章没有代码,你能帮什么忙吗?我已经编辑了这个问题。我希望它能帮助您理解。您能添加stacktrace吗?表示您在第一次请求时收到401错误:未经授权的错误,你现在想解决它吗?是的,就在调用刷新令牌之后,现在我想再次请求之前的401 http…意味着我还想知道令牌身份验证的整个结构。你想知道api流
,或者如何从刷新令牌
生成accesstoken
?第二,如果这篇文章没有代码,你能帮什么忙吗?我已经编辑了这个问题。我希望它能帮助你理解。你能添加stacktrace吗?谢谢你的解决方案,但我仍然需要添加access Token作为标题,该标题来自正在重复的新api中的refreshToken()。你能告诉我在获得refresh Token后如何恢复代码吗。Hi@Talhamansoor,执行return deferred.resolve($http(rejection.config))代码>获取刷新令牌后。如果您需要更多的代码,请告诉我。感谢您提供的解决方案,但我仍然需要在新api中添加来自refreshToken()的access Token作为标头,该标头正在重复。请告诉我在获得refresh Token后如何恢复代码。Hi@Talhamansoor,执行return deferred.resolve($http(rejection.config))代码>获取刷新令牌后。如果需要更多的代码,请告诉我。