Keycloak-js updateToken(minValidity) 需要澄清

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

我在Keycloak-js中阅读了很多该方法的示例,但没有明确解释以下方法。

        updateToken(minValidity: number): KeycloakPromise<boolean, boolean>;

注意:我正在使用

"keycloak-js": "^15.0.2"

这是它的文档

    /**
     * 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).then(function(refreshed) {
     *   if (refreshed) {
     *     alert('Token was successfully refreshed');
     *   } else {
     *     alert('Token is still valid');
     *   }
     * }).catch(function() {
     *   alert('Failed to refresh the token, or the session has expired');
     * });
     */

我的母语不是英语。 “在此期限内到期”一词在这里并不精确。

看个图就更好理解了。此方法

updateToken
定期检查令牌在时间窗口内是否过期
minValidity

enter image description here

token什么时候刷新?

当 keycloak 令牌到期时,令牌刷新可以是:

  • 在时间窗口内的到期日期之前
    minValidity
    (蓝色)
  • 或者在下一个周期更新检查之后。 (橙色)

在蓝色的情况下,具有足够大的

minValidity
值是有意义的。

橙色情况下,值越小越好。

我知道是蓝色的盒子。

额外问题:如果代币持续时间< minValidity ?

会发生什么
javascript typescript token keycloak
2个回答
5
投票

总的来说,您希望避免将 AccessToken 发送到服务器/服务但由于它不再有效而被拒绝的情况。

因此,每次使用令牌之前检查有效性是个好主意。正如文档提到的:对服务/后端的调用只能在

updateToken
方法的回调中进行。但除此之外,没有(自动)定期检查刷新令牌。

如果您想象剩余的 AccessToken 生命周期只有 1 秒的情况,那么

minValidity
就会出现。 如果您在客户端检查令牌(
isTokenExpired()
=>
false
),它仍然有效,但有可能当请求到达服务时,令牌将不再有效并被拒绝。 => 我们想避免这种情况

minValidity
的默认值为 5 秒。因此,当调用
updateToken
方法并且令牌仍然有效,但将在接下来的 5 秒内过期时,令牌将被刷新,并且回调内的任何服务/后端调用都将使用新令牌。但调用本身并不一定意味着新的令牌。如果剩余寿命足够长,则不会发生任何事情。

所以在你的例子中蓝色的情况是正确的。第二个“更新”调用(如果您指的是

updateToken
方法调用)将已经触发令牌刷新。但同样:更新调用不会自动完成。您需要在后端调用之前实施定期检查或调用 updateToken。

对于你的额外问题:我研究了代码并在一个虚构的情况下,例如minValidity 为 60 秒,但新的令牌始终仅在 30 秒内有效,每次调用 updateToken 都会触发刷新。但恕我直言,不会出现重复的“刷新循环”


0
投票

对于那些试图立即更新令牌的人 - 只需将

-1
作为
minValidity
参数

keycloakService.updateToken(-1);
© www.soinside.com 2019 - 2024. All rights reserved.