我在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
token什么时候刷新?
当 keycloak 令牌到期时,令牌刷新可以是:
minValidity
(蓝色)在蓝色的情况下,具有足够大的
minValidity
值是有意义的。
橙色情况下,值越小越好。
我知道是蓝色的盒子。
额外问题:如果代币持续时间< minValidity ?
会发生什么总的来说,您希望避免将 AccessToken 发送到服务器/服务但由于它不再有效而被拒绝的情况。
因此,每次使用令牌之前检查有效性是个好主意。正如文档提到的:对服务/后端的调用只能在
updateToken
方法的回调中进行。但除此之外,没有(自动)定期检查刷新令牌。
如果您想象剩余的 AccessToken 生命周期只有 1 秒的情况,那么
minValidity
就会出现。
如果您在客户端检查令牌(isTokenExpired()
=> false
),它仍然有效,但有可能当请求到达服务时,令牌将不再有效并被拒绝。 => 我们想避免这种情况
minValidity
的默认值为 5 秒。因此,当调用 updateToken
方法并且令牌仍然有效,但将在接下来的 5 秒内过期时,令牌将被刷新,并且回调内的任何服务/后端调用都将使用新令牌。但调用本身并不一定意味着新的令牌。如果剩余寿命足够长,则不会发生任何事情。
所以在你的例子中蓝色的情况是正确的。第二个“更新”调用(如果您指的是
updateToken
方法调用)将已经触发令牌刷新。但同样:更新调用不会自动完成。您需要在后端调用之前实施定期检查或调用 updateToken。
对于你的额外问题:我研究了代码并在一个虚构的情况下,例如minValidity 为 60 秒,但新的令牌始终仅在 30 秒内有效,每次调用 updateToken 都会触发刷新。但恕我直言,不会出现重复的“刷新循环”
对于那些试图立即更新令牌的人 - 只需将
-1
作为 minValidity
参数
keycloakService.updateToken(-1);