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

  • 刷新令牌携带获取新访问令牌所需的信息。换句话说,每当需要访问令牌来访问特定资源时,客户端可以使用刷新令牌来获取由认证服务器颁发的新访问令牌

以及如何在angular js中使用它参见此链接, 它将指导你如何去做


看到这个相关的项目,你可以从中得到一些想法

  • refresh-token
    是一种特殊的
    JWT
    ,用于随时获取更新的
    id\u-token

  • 刷新令牌携带获取新访问令牌所需的信息。换句话说,每当需要访问令牌来访问特定资源时,客户端可以使用刷新令牌来获取由认证服务器颁发的新访问令牌

以及如何在angular js中使用它参见此链接, 它将指导你如何去做



看到这个相关的项目,你可以从中得到一些想法

在分析错误响应时,可以执行以下操作:

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))获取刷新令牌后。如果需要更多的代码,请告诉我。