我的项目使用的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;