首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何保持会话活动,而使用键盘斗篷在角7?

如何保持会话活动,而使用键盘斗篷在角7?
EN

Stack Overflow用户
提问于 2020-06-12 07:47:26
回答 1查看 6.6K关注 0票数 3

我正在使用这个插件https://github.com/mauriciovigolo/keycloak-angular在角7项目。

版本:

代码语言:javascript
复制
keycloak-angular : 6.1.0
angular : 7.1.4

成功登录后,这是我从/protocol/openid-connect/token获得的响应

代码语言:javascript
复制
expires_in : 1980
refresh_expires_in : 1800

它会自动注销用户并在30分钟后重定向到登录页面。这种行为很烦人。只要用户与应用程序交互,我希望这种行为就像什么都没有发生一样。换句话说,30分钟后不自动注销,它应该保持会话活动。

有人能指导我实现这一目标需要哪些具体步骤吗?

编辑1

正如@thijsfranck在他的回答中所建议的那样,我这样修改了代码,它起了作用。

app-init.ts

代码语言:javascript
复制
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);
      }
    });
  };
}

这是app.module.ts

代码语言:javascript
复制
providers: [
    {
      provide: APP_INITIALIZER,
      useFactory: initializer,
      multi: true,
      deps: [KeycloakService]
    }
  ]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-12 08:13:56

当auth令牌过期时,可以使用刷新令牌(如果有有效令牌)来检索新令牌。

请参阅下面的代码片段。我没有特别使用keycloak-angular,但是当您的令牌到期时,keycloak-js (您的库也使用)会发出一个名为onTokenExpired的事件。可以使用该事件触发令牌刷新。如果我正确地读取了文档,那么您应该可以访问keycloakAuth函数中的initializer()对象。

代码语言:javascript
复制
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);
    });    
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62339817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档