2017-02-28 936 views
3

我有一个使用Angularjs建立与Keycloak集成了认证和授权单页的应用程序。KEYCLOAK - 刷新/更新令牌不工作

我能够登录到我的应用程序,获取登录用户角色等去瞬间刷新令牌调用,它总是返回我的情况下,和用户注销的应用程序。虽然令牌有效时间设置得非常高。

如果用户打开了应用程序,我需要更新令牌。如果失败或过期令牌,我需要注销用户。 if (refreshed)总是返回false。

下面是我使用的一段代码。

var __env = {}; 

     Object.assign(__env, window.__env); 

     var keycloakConfig = { 
      "url" : __env.keycloakUrl, 
      "realm" : __env.keycloakRealm, 
      "clientId" : __env.keycloakClientId, 
      "credentials" : { 
      "secret" : __env.keycloakSecret 
      } 
     }; 
var keycloak = Keycloak(keycloakConfig); 
     keycloak.init({ 
      onLoad : 'login-required' 
     }).success(function(authenticated) { 
       if(authenticated){     
         keycloak.loadUserInfo().success(function(userInfo) { 
         bootstrapAngular(keycloak, userInfo, roles); 
        }); 
      } 
     }); 

function bootstrapAngular(keycloak, userInfo, roles) { 
     angular.module('myApp').run(
       function($rootScope, $http, $interval, $cookies) { 
        var updateTokenInterval = $interval(function() { 
         // refresh token if it's valid for less then 15 minutes 
        keycloak.updateToken(15).success(
           function(refreshed) { 
            if (refreshed) { 
             $cookies.put('X-Authorization-Token', 
               keycloak.token); 
            }else{ 
             $rootScope.logoutApp(); 
            } 
           }); 
        }, 600000); 
        updateTokenInterval; 
        $cookies.put('X-Authorization-Token', keycloak.token); 

        $rootScope.logoutApp = function() { 
         $cookies.remove('X-Authorization-Token'); 
         $interval.cancel(updateTokenInterval); 
         keycloak.logout(); 
        }; 
    } 
} 
+0

有类似的问题,你找到了解决方案? – Atropo

回答

0

我找不到解释它的API文档,但keycloak.updateToken()功能的timeout参数在,不以分钟为单位表示。

因此,如果服务器上的访问令牌生命周期的默认值为5分钟,则应该使用小于300秒的值。我学会了做一些实验。

//Update the token when will last less than 3 minutes 
keycloak.updateToken(180) 

顺便说一句,我建议你使用寿命超过5分钟的令牌。

在您的代码中您永远不会看到刷新令牌,因为刷新从未在15秒钟内触发。