响应

时间:2018-05-06 23:24:43

标签: reactjs onelogin oidc oidc-client-js

我一直在努力尝试使用oidc-client库实现令牌刷新。非常感谢任何帮助或见解。

堆栈:

  • 阵营
  • GraphQL(Apollo客户端)

结构:

我尝试了一些方法,从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应用程序中的令牌?任何帮助或观点将不胜感激。谢谢!

2 个答案:

答案 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)