在 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_type
和 refresh_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 中刷新用户身份验证服务器端?的主要内容,如果未能解决你的问题,请参考以下文章