nextjs项目如何实现remember me 保持登陆功能?

我的项目使用的nextjs以及官方提供的next-auth插件来做鉴权.不过由于token在服务端,不知道如何实现remember me保持用户登陆功能.以下是我的[...nextauth]文件.

import axios from 'axios';
import NextAuth from 'next-auth';
import CredentialsProvider from "next-auth/providers/credentials";
// import {baseURL} from '@/config/index'
let baseURL = 'https://api.staging.xxx.com'
async function refreshAccessToken(tokenObject) {
    try {
        // Get a new set of tokens with a refreshToken
        const tokenResponse = await axios.post(baseURL + '/api/v1/accounts/refresh-token', {
            refreshToken: tokenObject.refreshToken
        });

        return {
            ...tokenObject,
            accessToken: tokenResponse.data.data.access_token,
            accessTokenExpiry: tokenResponse.data.data.expires_in *1000 +Date.now(),
            refreshToken: tokenResponse.data.data.refresh_token
        }
    } catch (error) {
        return {
            ...tokenObject,
            error: "RefreshAccessTokenError",
        }
    }
}

const providers = [
    CredentialsProvider({
        name: 'Credentials',
        authorize: async (credentials) => {
            try {
                // Authenticate user with credentials
                const user = await axios.post(baseURL + '/api/v1/accounts/login', {
                    password: credentials.password,
                    email: credentials.email
                });
                if (user.data.data.access_token) {
                    return user.data;
                }

                return null;
            } catch (e) {
                throw new Error(e);
            }
        }
    })
]

const callbacks = {
    jwt: async ({ token, user }) => {
        if (user) {
            // This will only be executed at login. Each next invocation will skip this part.
            token.accessToken = user.data.access_token;
            token.accessTokenExpiry = user.data.expires_in *1000 +Date.now();
            token.refreshToken = user.data.refresh_token;
            token.user = user.data.user;
        }

        // If accessTokenExpiry is 24 hours, we have to refresh token before 24 hours pass.
        const shouldRefreshTime = Math.round(token.accessTokenExpiry  - Date.now());
        // console.log(shouldRefreshTime,'shouldRefreshTime');
        // If the token is still valid, just return it.
        if (shouldRefreshTime > 0) {
            return Promise.resolve(token);
        }
        
        // If the call arrives after 23 hours have passed, we allow to refresh the token.
        token = refreshAccessToken(token);
        return Promise.resolve(token);
    },
    session: async ({ session, token }) => {
        // console.log('get session',session,token);
        // Here we pass accessToken to the client to be used in authentication with your API
        session.accessToken = token.accessToken;
        session.accessTokenExpiry = token.accessTokenExpiry;
        session.refreshToken = token.refreshToken;
        session.user = token.user;
        session.error = token.error;
        const shouldRefreshTime = Math.round(token.accessTokenExpiry  - Date.now());
        // console.log(shouldRefreshTime,'shouldRefreshTime');
        // If the token is still valid, just return it.
        if (shouldRefreshTime > 0) {
            return Promise.resolve(session);
        }
        token = refreshAccessToken(token);
        return Promise.resolve(token);
    },
}

export const options = {
    providers,
    callbacks,
    pages: {},
    secret: 'your_secret'
}

const Auth = (req, res) => NextAuth(req, res, options)
export default Auth;
阅读 1.5k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进