Keycloak JS自动令牌刷新

8

我有一段与Keycloak和JS相关的代码。这段代码工作得非常好,除了当令牌过期时需要外部调用刷新令牌方法。如何在令牌过期时自动刷新令牌。

 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>';
                });
    }

请尝试此链接: https://dev59.com/CWAg5IYBdhLWcg3wo8P2 - Chris Ritchie
2个回答

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(() => {...});
}

即使现有的令牌过期了,令牌是否会被刷新? - Yalamber
1
如果处理程序基于超时,并且最小有效期大于当前时间戳,则刷新令牌应该能够生成新的有效访问令牌。 - Logus Graphics
@Fabian,我正在使用来自'keycloak-angular'的KeycloakService;一个JS适配器,但是我在这个适配器中找不到'onTokenExpired',有一个叫做'isTokenExpired()'的东西,但是当令牌过期时它不起作用,你有没有想法如何使用它? - Lisa
1
@Lisa 我通常使用React,但我在keycloak-angular的readme中找到了这个链接:https://github.com/mauriciovigolo/keycloak-angular#keycloak-js-events,看起来它对你也会有类似的作用 :) - Fabian

4

此方法仅适用于标准流程或混合流程。在隐式流程中无法刷新令牌。

令牌(访问令牌生命周期)将在已刷新令牌(SSO会话空闲)未过期的情况下进行刷新。这将在SSO会话最大持续时间内运行。

例如,访问令牌寿命为2分钟,您可以使用已刷新令牌(SSO会话空闲)在5分钟内刷新它。并且它将在最长10小时的SSO会话最大持续时间内运行。 enter image description here

可以在客户端(请参阅右侧导航栏)设置选项卡中的“高级设置”中覆盖访问令牌寿命。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接