如何在Angular 7中使用KeyClope时保持会话活动?

如何在Angular 7中使用KeyClope时保持会话活动?,angular,angular7,keycloak,Angular,Angular7,Keycloak,我在Angular 7项目中使用这个插件 版本: keycloak-angular : 6.1.0 angular : 7.1.4 成功登录后,这是我从/protocol/openid connect/token得到的响应: expires_in : 1980 refresh_expires_in : 1800 它会自动注销用户,并在30分钟后重定向到登录页面。这种行为令人讨厌。我希望,只要用户与应用程序交互,这种行为就好像什么都没发生过一样。换句话说,如果在30分钟后不自动注销,则应保持会

我在Angular 7项目中使用这个插件

版本:

keycloak-angular : 6.1.0
angular : 7.1.4
成功登录后,这是我从
/protocol/openid connect/token
得到的响应:

expires_in : 1980
refresh_expires_in : 1800
它会自动注销用户,并在30分钟后重定向到登录页面。这种行为令人讨厌。我希望,只要用户与应用程序交互,这种行为就好像什么都没发生过一样。换句话说,如果在30分钟后不自动注销,则应保持会话处于活动状态

有人能告诉我实现这一目标需要采取哪些具体步骤吗

编辑1

正如@thijsfranck在他的回答中所建议的,我这样修改了代码,并且成功了

app init.ts

import {KeycloakService} from 'keycloak-angular';
export function initializer(keycloak: KeycloakService) {
  return () => {
    return new Promise(async (resolve, reject) => {
      try {
        const _REALM = "realm";
        const _URL = "http://example.com";
        const _CLIENT_ID = "id"

        await keycloak.init({
          config: {
            realm: _REALM,
            url: _URL,
            clientId: _CLIENT_ID,
          },
          initOptions: {
            onLoad: 'login-required',
            checkLoginIframe: false
          },
          enableBearerInterceptor: true,
          bearerExcludedUrls: ['/assets', '/clients/public']
        })

        const keycloakAuth = keycloak.getKeycloakInstance();

        const updateToken = async (): Promise < string > => {
          const {success,error} = keycloakAuth.updateToken(5);
          return new Promise < string > ((res, rej) => {
            success(() => res(keycloakAuth.token));
            error(rej);
          });
        }
        const login = async (): Promise < void > => {
          const {success,error} = keycloakAuth.login();
          return new Promise < void > ((res2, rej2) => {
            success(res2);
            error(rej2);
          });
        }


        keycloakAuth.onTokenExpired = () => {
          if (keycloakAuth.refreshToken) {
            updateToken();
          } else {
            login();
          }
        }

        resolve();
      } catch (error) {
        reject(error);
      }
    });
  };
}
providers: [
    {
      provide: APP_INITIALIZER,
      useFactory: initializer,
      multi: true,
      deps: [KeycloakService]
    }
  ]

当您的身份验证令牌过期时,您可以使用刷新令牌(如果您有有效的令牌)检索新令牌

请参阅下面的代码片段。我没有专门使用过
keydape angular
,但是
keydape js
(您的库也使用它)会在您的身份验证令牌过期时发出一个名为
onTokenExpired
的事件。您可以使用该事件触发令牌刷新。如果我正确阅读了文档,您应该可以访问函数中的
keydapeauth
对象

import Keycloak from 'keycloak-js';

private keycloakAuth: Keycloak.KeycloakInstance;

/**
 * Whenever the token expires and a refresh token is available, try to refresh the access token.
 * Otherwise, redirect to login.
 */
this.keycloakAuth.onTokenExpired = () => {
    if (this.keycloakAuth.refreshToken) {
        this.updateToken();
    } else {
        this.login();
    }
};

async updateToken(): Promise<string> {
    const { success, error } = this.keycloakAuth.updateToken(5);
    return new Promise<string>((resolve, reject) => {
        success(() => resolve(this.keycloakAuth.token));
        error(reject);
    });    
}

async login(): Promise<void> {
    const { success, error } = this.keycloakAuth.login();
    return new Promise<void>((resolve, reject) => {
        success(resolve);
        error(reject);
    });    
}
从“keydove js”导入keydove;
private-keydepeauth:keydeport.keydepeaptinstance;
/**
*每当令牌过期且刷新令牌可用时,尝试刷新访问令牌。
*否则,重定向到登录。
*/
this.keydepeauth.onTokenExpired=()=>{
if(this.keydepeauth.refreshtToken){
this.updateToken();
}否则{
this.login();
}
};
异步updateToken():承诺{
const{success,error}=this.keydapeauth.updateToken(5);
返回新承诺((解决、拒绝)=>{
成功(()=>解析(this.keydepeauth.token));
错误(拒绝);
});    
}
异步登录():承诺{
const{success,error}=this.keydepeauth.login();
返回新承诺((解决、拒绝)=>{
成功(决心);
错误(拒绝);
});    
}

我已将代码放置到位,但令牌过期后仍需要登录屏幕,请参阅我的更新问题。我注意到您的刷新令牌的生存期为
1800
,而访问令牌的生存期为
1980
。因此,在您尝试刷新之前,您的刷新令牌将过期。因此,刷新将失败,您将被重定向到登录。尝试延长刷新令牌的生存期。