KEYCLOAK - 刷新/更新令牌不起作用

Ank*_*hal 11 authentication token angularjs keycloak

我有单页应用程序,该应用程序使用Angularjs并集成Keycloak用于身份验证和授权

我能够登录我的应用程序,获得登录的用户角色等。刷新令牌调用的那一刻,它总是在我的其他情况下返回,并且用户注销应用程序。虽然令牌有效时间设置得非常高。

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

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

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();
                    };
    }
}
Run Code Online (Sandbox Code Playgroud)

Atr*_*opo 11

我在 API 文档中找不到解释,但函数的timeout参数keycloak.updateToken()表示,而不是分钟。

因此,如果服务器上的访问令牌寿命为默认值 5 分钟,则应使用小于 300 秒的值。我通过一些实验了解到它。

//Update the token when will last less than 3 minutes
keycloak.updateToken(180)
Run Code Online (Sandbox Code Playgroud)

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

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

  • 如果您需要强制刷新令牌(例如更新其中的权限),您可以使用“updateToken(-1)”。请勿滥用此... (2认同)

Cha*_*nka 10

(refreshed) 仅当您的令牌未过期时才返回 false。因此,您正在尝试在令牌尚未过期时刷新令牌

在您使用的Keycloak 领域中将“Access Token Lifespan ”设置为 1 分钟,然后尝试以下代码再次检查刷新状态

keycloak.onTokenExpired = ()=>{
            console.log('expired '+new Date());
            keycloak.updateToken(50).success((refreshed)=>{
                if (refreshed){
                    console.log('refreshed '+new Date());
                }else {
                    console.log('not refreshed '+new Date());
                }
            }).error(() => {
                 console.error('Failed to refresh token '+new Date());
            });
            }
Run Code Online (Sandbox Code Playgroud)

  • “所以你试图在令牌尚未过期时刷新令牌”是的,就是这样!谢谢你 (2认同)