KEYCLOAK - Refresh/update 令牌不工作
KEYCLOAK - Refresh/update token not working
我有一个使用 Angularjs
构建并与 Keycloak
集成的单页应用程序,用于 身份验证和授权 .
我能够登录到我的应用程序,获得登录用户角色等。刷新令牌调用的那一刻,它总是 returns 在我的其他情况下,用户注销应用程序。虽然token有效时间设置的很高
如果用户打开了应用程序,我需要更新令牌。如果出现故障或令牌过期,我需要注销用户。 if (refreshed)
始终 returns 错误。
下面是我正在使用的代码。
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();
};
}
}
您看过我们的 Angular 示例应用 https://github.com/keycloak/keycloak/blob/master/examples/demo-template/angular-product-app/src/main/webapp/js/app.js 了吗?它可能会给你一些提示。
我在 API 文档中找不到解释,但 keycloak.updateToken()
函数的 timeout
参数以 秒 表示,不是几分钟。
因此,如果服务器上的 Access Token Lifespan 的默认值为 5 分钟,您应该使用小于 300 秒的值。
我在做一些实验时学会了它。
//Update the token when will last less than 3 minutes
keycloak.updateToken(180)
顺便说一句,我建议您使用 Lifespan 超过 5 分钟的令牌。
在您的代码中您永远不会看到令牌被刷新,因为刷新不会在 15 秒内触发 window,这将起作用。
我看一下他们的示例代码:
/**
* 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 return false。
(refreshed) returns false 仅当您的令牌未过期时。因此,您正在尝试 在令牌尚未过期时刷新令牌 。
在您正在使用的 Keycloak 领域 中将“访问令牌寿命”设置为 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());
});
}
在标准流程中,我注意到令牌到期来自访问令牌生命周期,刷新令牌到期来自 SSO 会话空闲。并且建议访问令牌寿命应短于 SSO 超时。应该反过来吗?
也可以在高级设置下的客户端设置选项卡中覆盖访问令牌寿命。
我有一个使用 Angularjs
构建并与 Keycloak
集成的单页应用程序,用于 身份验证和授权 .
我能够登录到我的应用程序,获得登录用户角色等。刷新令牌调用的那一刻,它总是 returns 在我的其他情况下,用户注销应用程序。虽然token有效时间设置的很高
如果用户打开了应用程序,我需要更新令牌。如果出现故障或令牌过期,我需要注销用户。 if (refreshed)
始终 returns 错误。
下面是我正在使用的代码。
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();
};
}
}
您看过我们的 Angular 示例应用 https://github.com/keycloak/keycloak/blob/master/examples/demo-template/angular-product-app/src/main/webapp/js/app.js 了吗?它可能会给你一些提示。
我在 API 文档中找不到解释,但 keycloak.updateToken()
函数的 timeout
参数以 秒 表示,不是几分钟。
因此,如果服务器上的 Access Token Lifespan 的默认值为 5 分钟,您应该使用小于 300 秒的值。 我在做一些实验时学会了它。
//Update the token when will last less than 3 minutes
keycloak.updateToken(180)
顺便说一句,我建议您使用 Lifespan 超过 5 分钟的令牌。
在您的代码中您永远不会看到令牌被刷新,因为刷新不会在 15 秒内触发 window,这将起作用。
我看一下他们的示例代码:
/**
* 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 return false。
(refreshed) returns false 仅当您的令牌未过期时。因此,您正在尝试 在令牌尚未过期时刷新令牌 。
在您正在使用的 Keycloak 领域 中将“访问令牌寿命”设置为 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());
});
}
在标准流程中,我注意到令牌到期来自访问令牌生命周期,刷新令牌到期来自 SSO 会话空闲。并且建议访问令牌寿命应短于 SSO 超时。应该反过来吗? 也可以在高级设置下的客户端设置选项卡中覆盖访问令牌寿命。