【问题标题】:KEYCLOAK - Refresh/update token not workingKEYCLOAK - 刷新/更新令牌不起作用
【发布时间】:2017-07-18 21:31:20
【问题描述】:

我有一个使用Angularjs 构建并与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();
                    };
    }
}

【问题讨论】:

  • 遇到了类似的问题,你找到解决办法了吗?

标签: angularjs authentication token keycloak


【解决方案1】:

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

因此,如果服务器上的 Access Token Lifespan 为默认值 5 分钟,则应使用小于 300 秒的值。 我通过一些实验学会了它。

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

顺便说一句,我建议您为令牌使用超过 5 分钟的 Lifespan

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

【讨论】:

  • 如果您需要强制刷新令牌(例如更新其中的权限),您可以使用updateToken(-1)。不要滥用这个...
【解决方案2】:

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

【讨论】:

  • So you're trying to refresh the token when it has not yet expired 是的,就是这样!谢谢你
  • 你能解释一下 updateToken 最小有效性参数(本例中为 50)是什么意思吗?在我的情况下,我有 WebSocket 连接,当令牌过期时,连接关闭,我重试,重试,重试......所以我可以说令牌曾经正确刷新并打开连接吗?
  • 如果令牌在 minValidity 秒内过期(minValidity 是可选的,如果未指定,则使用 5)刷新令牌。如果启用了会话状态 iframe,则还会检查会话状态。这就是文档所说的
【解决方案3】:

我看看他们的示例代码:

        /**
     * If the token expires within `minValidity` seconds, the token is refreshed.
     * If the session status iframe is enabled, the session status is also
     * checked.
     * @returns A promise to set functions that can be invoked if the token is
     *          still valid, or if the token is no longer valid.
     * @example
     * ```js
     * keycloak.updateToken(5).success(function(refreshed) {
     *   if (refreshed) {
     *     alert('Token was successfully refreshed');
     *   } else {
     *     alert('Token is still valid');
     *   }
     * }).error(function() {
     *   alert('Failed to refresh the token, or the session has expired');
     * });
     */

所以我认为你的令牌仍然有效,这就是 updateToken 返回 false 的原因。

【讨论】:

    【解决方案4】:

    您是否查看过我们的 Angular 示例应用程序 https://github.com/keycloak/keycloak/blob/master/examples/demo-template/angular-product-app/src/main/webapp/js/app.js ?它可能会给你一些提示。

    【讨论】:

    • 我用的是同样的东西,它并没有解决我的目的,实际上它根本没有刷新令牌。
    【解决方案5】:

    在标准流程中,我注意到令牌过期来自访问令牌生命周期和 SSO 会话空闲的刷新令牌过期。并且建议 Access Token Lifespan 应该比 SSO 超时更短。应该反过来吗? 也可以在高级设置下的客户端设置选项卡中覆盖访问令牌生命周期。

    【讨论】:

      猜你喜欢
      • 2021-01-22
      • 2019-04-21
      • 2018-03-29
      • 2020-09-01
      • 2020-08-14
      • 2021-05-13
      • 2022-01-21
      • 2021-08-24
      • 2021-09-29
      相关资源
      最近更新 更多