ユーザーの簡単な電子メール/パスワード ログイン フローに next-auth の資格情報プロバイダーを使用し、更新トークンを処理するためのセッション オプションの最適な組み合わせを見つけようとしています。
現在、ログインに成功すると、API は JWT とUSER_SESSION_LENGTH
30 分の構成プロパティを返します。
と の 30 分に設定されたプロバイダー オプションの組み合わせがありclientMaxAge
、keepAlive
JWT コールバックで、有効期限が「almostNow」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;
},
}