在 NextJS 中刷新用户身份验证服务器端?

Posted

技术标签:

【中文标题】在 NextJS 中刷新用户身份验证服务器端?【英文标题】:Refreshing user auth server side in NextJS? 【发布时间】:2021-09-04 12:30:57 【问题描述】:

我正在尝试在 NextJS 中刷新服务器上的用户身份验证令牌,目前我在我访问的 cookie 中设置了令牌,如下所示:

export async function getServerSideProps(ctx) 
    const cookies = nookies.get(ctx);
    try 
        const client = useClient(cookies.token);
    // etc
    

不幸的是,如果令牌已过期,这将失败并出现令牌已过期错误。

我确实可以访问刷新令牌,但不确定如何使用它,firebase.auth().currentUser 在 getServersideProps 中也未定义

【问题讨论】:

【参考方案1】:

我在使用 NuxtJS 时遇到了类似的问题,最简单的方法是将用户重定向到另一个页面,您可以在其中在客户端获取新的 Firebase ID 令牌,然后刷新 cookie。例如,您可以重定向到类似https://domain.tld/auth/refresh?redirect_uri=/dashboard 的页面。查询参数redirect_uri 告诉用户在哪里,并且必须在刷新令牌后重定向回来。

如果您想避免重定向,则必须在服务器端存储“刷新令牌”。我不确定这会有多安全,但不要将刷新令牌存储在 cookie 中。但如果您想知道如何使用刷新令牌获取新的 Firebase ID 令牌,您可以向该 URL 发出 POST 请求:

https://securetoken.googleapis.com/v1/token?key=FirebasePublicAPIKey

API 密钥在您的 Firebase 配置中可用。此 POST 请求的正文似乎是 URL 编码的,并且具有 grant_typerefresh_token 字段。

这是相同的 cURL 请求:

curl "https://securetoken.googleapis.com/v1/token?key=firebaseAPIKey" \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -X POST \
  -F 'grant_type=refresh_token' \
  -F 'refresh_token=firebaseRefreshToken' 

我刚刚使用 Chrome DevTools 检查令牌的刷新方式并发现了这一点。

第一种方法对我来说听起来更安全,我个人使用它而不是在服务器或 cookie 上的某处存储刷新令牌。事实上,我在 cookie 中使用来自服务器的自定义 JWT 令牌,而不是 Firebase ID 令牌本身。

【讨论】:

以上是关于在 NextJS 中刷新用户身份验证服务器端?的主要内容,如果未能解决你的问题,请参考以下文章

使用React和NextJS保护API身份验证请求

Laravel 身份验证会话超时

nextjs 路由中间件进行身份验证

如何在 blazor webassembly 项目中对服务器端控制器中的用户进行身份验证?

简单服务器端Blazor Cookie身份验证的演示

Twitter Fabric 服务器端身份验证