keycloak js 自动令牌刷新

问题描述 投票:0回答:3

我有一段使用 keycloak 和 JS 的代码。 除了刷新令牌方法必须在令牌过期时从外部调用之外,代码工作正常。 token过期后如何自动刷新。

 var keycloak = Keycloak('keycloak.json');

 keycloak.init({ onLoad: 'login-required' })
        .success(reloadData)
        .error(function(errorData) {
            document.getElementById('customers').innerHTML = '<b>Failed to load data. Error: ' + JSON.stringify(errorData) + '</b>';
    });

 var loadData = function () {
        document.getElementById('subject').innerHTML = keycloak.subject;
        if (keycloak.idToken) {
            document.getElementById('profileType').innerHTML = 'IDToken';
            document.getElementById('username').innerHTML = keycloak.idTokenParsed.preferred_username;
            document.getElementById('email').innerHTML = keycloak.idTokenParsed.email;
            document.getElementById('name').innerHTML = keycloak.idTokenParsed.name;
            document.getElementById('givenName').innerHTML = keycloak.idTokenParsed.given_name;
            document.getElementById('familyName').innerHTML = keycloak.idTokenParsed.family_name;
        } else {
            keycloak.loadUserProfile(function() {
                document.getElementById('profileType').innerHTML = 'Account Service';
                document.getElementById('username').innerHTML = keycloak.profile.username;
                document.getElementById('email').innerHTML = keycloak.profile.email;
                document.getElementById('name').innerHTML = keycloak.profile.firstName + ' ' + keycloak.profile.lastName;
                document.getElementById('givenName').innerHTML = keycloak.profile.firstName;
                document.getElementById('familyName').innerHTML = keycloak.profile.lastName;
            }, function() {
                document.getElementById('profileType').innerHTML = 'Failed to retrieve user details. Please enable claims or account role';
            });
        }

        var url = '/database/customers';
        var req = new XMLHttpRequest();
        req.open('GET', url, true);
        req.setRequestHeader('Accept', 'application/json');
        req.setRequestHeader('Authorization', 'Bearer ' + keycloak.token);
        req.onreadystatechange = function () {
            if (req.readyState == 4) {
                if (req.status == 200) {
                    var users = JSON.parse(req.responseText);
                    var html = '';
                    for (var i = 0; i < users.length; i++) {
                        html += '<p>' + users[i] + '</p>';
                    }
                    document.getElementById('customers').innerHTML = html;
                    console.log('finished loading data');
                }
            }
        }
        req.send();
    };
    var loadFailure = function () {
        document.getElementById('customers').innerHTML = '<b>Failed to load data.  Check console log</b>';
    };
    var reloadData = function () {
        keycloak.updateToken(10)
                .success(loadData)
                .error(function() {
                    document.getElementById('customers').innerHTML = '<b>Failed to load data.  User is logged out.</b>';
                });
    }
javascript keycloak
3个回答
20
投票

我知道已经很晚了,但这个答案仅供将来参考。

不知道它是否是新的,并且该处理程序未在 2017 年实现,但我使用

keycloak.onTokenExpired
来执行此操作。

举个例子:

keycloak.onTokenExpired = () => {
    console.log('token expired', keycloak.token);
    keycloak.updateToken(30).success(() => {
        console.log('successfully get a new token', keycloak.token);
        ...
    }).error(() => {...});
}

4
投票

这仅适用于标准流程或混合流程。在隐式流程期间不可能刷新令牌。

只要刷新的令牌(SSO 会话空闲)尚未过期,令牌(访问令牌寿命)就会被刷新。这将在 SSO 会话最大持续时间内有效。

示例令牌(访问令牌寿命)将在 2 分钟内过期,您可以在 5 分钟内使用刷新的令牌(SSO 会话空闲)刷新它。它将在 10 小时 SSO 会话最大时间内发挥最大作用

访问令牌的寿命可以在客户端中被覆盖(参见右侧导航)“设置”选项卡向下滚动到“高级设置”


0
投票

以下间隔每 3 秒检查一次令牌并执行更新。如果您需要更多/更少的间隔,请调整最后的值(3000)

function intervall(){
 keycloak.updateToken(5).then(function(refreshed) {
        if (refreshed) {
          console.log('Token was successfully refreshed');
        } else {
          console.log('Token is still valid');
        }
      }).catch(function() {
                console.log('failed to initialize');
         
            });

}
      
setInterval(intervall, 3000);

© www.soinside.com 2019 - 2024. All rights reserved.