如何使用刷新令牌配置 clientMaxAge/keepAlive? (下一个认证)

Posted

技术标签:

【中文标题】如何使用刷新令牌配置 clientMaxAge/keepAlive? (下一个认证)【英文标题】:How to configure clientMaxAge/keepAlive with refresh tokens? (next-auth) 【发布时间】:2021-08-02 01:22:00 【问题描述】:

使用来自 next-auth 的凭据提供程序为我们的用户提供简单的电子邮件/密码登录流程,我正在尝试找出会话选项的最佳组合来处理刷新令牌。

目前,成功登录后,我们的 API 会发回 JWT 和配置属性 USER_SESSION_LENGTH,时间为 30 分钟。

我将 clientMaxAgekeepAlive 的提供程序选项组合设置为 30 分钟,并在 JWT 回调中检查到期时间是否小于“几乎现在”Date.now()调用,如果是,则重新获取新的 JWT 并重置过期时间。

虽然这似乎可行,但我认为我没有正确使用 clientMaxAge/keepAlive。我应该如何正确设置/配置这些值以协同工作?

// _app.tsx
const sessionOptions = 
    clientMaxAge: 60 * 30, // Re-fetch session if cache is older than 30 minutes 
    keepAlive: 60 * 30
;

<Provider options=sessionOptions session=pageProps.session>
    <Component ...pageProps />
</Provider>

// [...nextauth].ts
const callbacks: CallbacksOptions = 
    async jwt(token: any, user: any) 
        if (user) 
            token.accessToken = user.token;
            token.expires = Date.now() + user.config.USER_SESSION_LENGTH * 1000;
        

        if (token?.accessToken) 
            const tokenExpiry = token.expires;
            const almostNow = Date.now() + 60 * 1000; // random check of a minute past now so it won't run the first time, but on the refetch after 30 minutes.

            if (tokenExpiry !== undefined && tokenExpiry < almostNow) 
                try 
                    const newToken = await api.renewToken(token.accessToken); // hit our backend for new token
                    token.accessToken = newToken.token;
                    token.expires = Date.now() + user.config.USER_SESSION_LENGTH * 1000;
                 catch (error) 
                    console.error(error, 'Error refreshing access token');
                
            
        

        return token;
    ,

【问题讨论】:

【参考方案1】:

我建议阅读this github issue,其中讨论了这一点。基本上,设置 maxAge 具有我认为您所追求的效果。

[...nextauth].js
...
session: 
  jwt: true,
  maxAge: 60 * 60,

...

【讨论】:

以上是关于如何使用刷新令牌配置 clientMaxAge/keepAlive? (下一个认证)的主要内容,如果未能解决你的问题,请参考以下文章

如何测试我的令牌是不是使用 IdentityServer4 刷新?

带有刷新令牌的 Spring Google OAuth2

如何使用带有 OpenId Connect 的刷新令牌在 asp.net 核心中处理过期的访问令牌

如何使用刷新令牌刷新访问令牌?

Cognito 用户池:如何使用刷新令牌刷新访问令牌

如何使用刷新令牌更新访问令牌?