我一直在尝试使用oidc-client库实现令牌刷新,但没有取得什么成功。任何帮助或洞察力都是非常感谢的。
堆叠:
结构:
我尝试了几种方法,从automaticSilentRenew开始,在我的public/文件夹中创建一个static-renew.html回调文件--但是这两种方法都给了我一个No state in response错误,所以我开始了一个解决办法。
解决办法:
我正在将路由器包装在一个组件中,该组件执行以下操作:
oidc-client.getUser(),然后添加以下侦听器:- `oidcMgr.events.addAccessTokenExpiring(handleTokenExpiring)`
- `window.addEventListener('message', this.handleSilentRenew)`
addAccessTokenExpiring事件第一次触发时,它调用一个函数:oidcMgr.createSigninRequest({ redirect_uri: process.env.REACT_APP_SILENT_REDIRECT_URI }),并使用apollo-link-state将响应设置为本地状态。silent-renew发布消息,以便步骤1中挂载的侦听器可以在apollo-link-state中将令牌URI设置为'',从而终止iframe并再次调用getUser。这可用于刷新令牌,但iFrame似乎正在将整个应用程序加载到其中,然后终止,从而导致应用程序消耗超过必要的资源。
是否有另一种更直接的方法来使用这个库来刷新React应用程序中的令牌?任何帮助或观点都将受到极大的感谢。谢谢!
发布于 2018-05-08 05:50:18
这可能会让你在你使用的方法上有一些提示,
我使用了一些不同的方法来激发silentRenw,而不是使用
automaticSilentRenew:真,
我决定显式调用signInSilent();。做I的原因是由于automaticSilentRenew所面临的一些问题:是的,没有像预期的那样工作。
我在实现我的接口的UserAuth类构造函数中初始化了事件和方法
constructor(private oidcSettings: CoreApi.Interfaces.Authentication.OpenIDConnectionSettings)
{
this.userManager.events.addAccessTokenExpiring(() =>
{
this.userManager.signinSilent({scope: oidcSettings.scope, response_type: oidcSettings.response_type})
.then((user: Oidc.User) =>
{
this.handleUser(user);
})
.catch((error: Error) =>
{
//Work around to handle to Iframe window timeout errors on browsers
this.userManager.getUser()
.then((user: Oidc.User) =>
{
this.handleUser(user);
});
});
});
}当handleUser被选中时,您只需查看登录用户。
因此,如果在构造函数中初始化signInSilent进程,然后调用signInSilent完成,即回调,它可能会工作。
发布于 2018-06-02 15:06:22
您的静态更新. has有什么?它通常应该加载、oidc-client js和一个处理signinCallback的函数,一旦回调中的标志处理得很好,它就会发出一个事件UserLoaded,这就是您的父程序需要更新用户对象(access_token,id_token)的地方。
https://stackoverflow.com/questions/50205407
复制相似问题