0

我一直在尝试使用该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 应用程序中的令牌?任何帮助或观点将不胜感激。谢谢!

4

2 回答 2

0

这可能会让您对正在使用的方法有所了解,

我使用了一些不同的方法来启动silentRenw,而不是使用

自动静音更新:真,

我决定显式调用 signInSilent();。这样做的原因我遇到了一些问题,因为 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 完成即回调,它可能会起作用。

于 2018-05-08T05:50:18.107 回答
0

你的 static-renew.html 有什么?它通常应该加载,oidc-client js和一个处理signinCallback的函数,一旦登录回调处理得好,它就会发出一个事件UserLoaded,这是你的父母需要更新用户对象的地方(access_token,id_token)

于 2018-06-02T15:06:22.650 回答