2017-02-28 931 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秒鐘內觸發。