我一直在尝试使用该oidc-client库实现令牌刷新,但收效甚微。非常感谢任何帮助或见解。
堆:
- 反应
- GraphQL(阿波罗客户端)
结构:
我尝试了几种方法,首先是在我的文件夹中automaticSilentRenew创建一个static-renew.html回调文件public/- 但这两种方法都给了我一个No state in response错误,所以我开始着手解决方法。
解决方法:
我将路由器包装在一个组件中,该组件执行以下操作:
在 mount 它调用
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当 apollo-link-state 中存在 tokenURI 时渲染 iFrame(来自上面的函数)。
当组件卸载时,它会删除两个侦听器。
- 当回调 URL 被命中时,它会挂载一个向源发布消息的组件,
silent-renew以便在步骤 1 中安装的侦听器可以将令牌 URI 设置为''inapollo-link-state从而终止 iframe 并getUser再次调用。
这适用于刷新令牌,但似乎 iFrame 正在将整个应用程序加载到其中,然后终止,导致应用程序消耗了不必要的资源。
有没有另一种更直接的方法来使用这个库来刷新 React 应用程序中的令牌?任何帮助或观点将不胜感激。谢谢!