我一直在努力尝试使用oidc-client
库实现令牌刷新。非常感谢任何帮助或见解。
堆栈:
结构:
我尝试了一些方法,从automaticSilentRenew
开始并在我的static-renew.html
文件夹中创建了一个public/
回调文件 - 但这两种方法都给了我一个{{1}错误,所以我开始解决方法。
解决方法:
我将路由器包装在执行以下操作的组件中:
在挂载时调用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中有一个tokenURI时(从上面的函数中)渲染iFrame。
当组件卸载时,它会删除两个侦听器。
apollo-link-state
的邮件的组件,因此步骤1中安装的侦听器可以将标记URI设置为silent-renew
中的''
从而终止iframe并再次调用apollo-link-state
。这适用于刷新令牌,但似乎iFrame正在加载整个应用程序,然后终止,导致应用程序消耗的资源超过必要的数量。
是否有另一种更直接的方法来使用此库来刷新React应用程序中的令牌?任何帮助或观点将不胜感激。谢谢!
答案 0 :(得分:0)
这可能会让您对正在使用的方法有所了解,
我使用了一些不同的方法来启动silentRenw,而不是使用
automaticSilentRenew:true,
我决定明确调用signInSilent();.做i的原因是面临一些问题,因为automaticSilentRenew:true,没有按预期工作。
我在实现我的接口的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完成,即回调它可能会有效。
答案 1 :(得分:0)
您的static-renew.html有什么作用?它应该通常加载,oidc-client js和一个函数来处理signinCallback,一旦登录回调处理得好,它就会发出一个事件UserLoaded,这是你父母需要更新用户对象的地方(access_token,id_token)