Angularjs 密钥斗篷-刷新/更新令牌不工作
我有一个单页应用程序,它使用Angularjs 密钥斗篷-刷新/更新令牌不工作,angularjs,authentication,token,keycloak,Angularjs,Authentication,Token,Keycloak,我有一个单页应用程序,它使用Angularjs构建,并与keydape集成,用于身份验证和授权 我可以登录到我的应用程序,获取loggedin用户角色等。刷新令牌调用的那一刻,它总是在我的else情况下返回,并且用户注销应用程序。虽然令牌有效时间设置得很高 如果用户已打开应用程序,我需要更新令牌。如果出现故障或令牌过期,我需要注销用户如果(刷新)始终返回false 下面是我正在使用的一段代码 var __env = {}; Object.assign(__env, window
Angularjs
构建,并与keydape
集成,用于身份验证和授权
我可以登录到我的应用程序,获取loggedin用户角色等。刷新令牌调用的那一刻,它总是在我的else情况下返回,并且用户注销应用程序。虽然令牌有效时间设置得很高
如果用户已打开应用程序,我需要更新令牌。如果出现故障或令牌过期,我需要注销用户<代码>如果(刷新)始终返回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();
};
}
}
你看过我们的Angular示例应用程序了吗?它可能会给你一些提示 我在API文档中找不到解释,但是
keydape.updateToken()
函数的timeout
参数是以秒来表示的,而不是以分钟来表示的
因此,如果服务器上的访问令牌寿命为默认值5分钟,则应使用小于300秒的值。
我是在做实验的时候学会的
//Update the token when will last less than 3 minutes
keycloak.updateToken(180)
顺便说一句,我建议你使用寿命超过5分钟的代币
在您的代码中,您从未看到令牌被刷新,因为刷新从未在15秒窗口中触发,在该窗口中,刷新将起作用。我查看了他们的示例代码:
/**
* 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。(刷新)仅当您的令牌未过期时才返回false。因此,您试图在令牌尚未过期时刷新令牌
在您正在使用的密钥斗篷领域中,将“访问令牌寿命”设置为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超时。应该是另一种方式吗?
此外,还可以在“高级设置”下的“客户端设置”选项卡中覆盖访问令牌的寿命。我使用的是相同的东西,它不能解决我的目的,实际上根本不能刷新令牌。遇到类似问题,您找到解决方案了吗?如果您需要强制刷新令牌(例如更新令牌中的权限)您可以使用
updateToken(-1)
。不要滥用此…因此,您试图在令牌尚未过期时刷新令牌
是的,就是这样!谢谢,希望有帮助。你能解释一下updateToken min validity param(本例中为50)的含义吗?在我的情况下,我有WebSocket连接,当令牌过期时,连接关闭,我重试,重试,重试。。。那么我可以说令牌是否正确刷新并且连接已打开?如果令牌在minValidity秒内过期(minValidity是可选的,如果未指定,则使用5),则令牌将被刷新。如果启用了会话状态iframe,则还会检查会话状态。这就是文档中所说的