Next-Auth:如何使用电子邮件+密码凭据提供程序处理注册?
Next-Auth:如何使用电子邮件+密码凭据提供程序处理注册?
如何使用自定义凭据提供程序(email + password)处理registration
?
目前我的[...nextauth].js
如下所示:
import NextAuth from 'next-auth' import Providers from 'next-auth/providers' import axios from 'axios' import jwt from "next-auth/jwt"; const YOUR_API_ENDPOINT = process.env.NEXT_PUBLIC_API_ROOT + 'auth/store' const providers = [ Providers.Credentials({ name: 'Credentials', authorize: async (credentials) => { try { const user = await axios.post(YOUR_API_ENDPOINT, { password: credentials.password, username: credentials.email }, { headers: { accept: '*/*', 'Content-Type': 'application/json' } }) console.log('ACCESS TOKEN ----> ' + JSON.stringify(user.data.access_token, null, 2)); if (user) { return {status: 'success', data: user.data} } } catch (e) { const errorMessage = e.response.data.message // 在URL中将错误消息重定向到登录页面 throw new Error(errorMessage + '&email=' + credentials.email) } } }) ] const callbacks = { /* |-------------------------------------------------------------------------- | Callback : JWT |-------------------------------------------------------------------------- */ async jwt(token, user, account, profile, isNewUser) { if (user) { token.accessToken = user.data.access_token } return token }, /* |-------------------------------------------------------------------------- | Callback : Session |-------------------------------------------------------------------------- */ async session(session, token) { // 将访问令牌存储到会话中 session.accessToken = token.accessToken /* |-------------------------------------------------------------------------- | 获取用户数据 |-------------------------------------------------------------------------- */ const API_URL = 'http://localhost:3000/api'; const config = { headers: { Authorization: `Bearer ${token.accessToken}` } }; let userData; await axios.get(`${API_URL}/user`, config) .then(response => { userData = { id: response.data.id, uuid: response.data.uuid, username: response.data.username, avatar_location: response.data.avatar_location, gender_id: response.data.gender_id, date_of_birth: response.data.date_of_birth, country_id: response.data.country_id, location: response.data.location, about_me: response.data.about_me, interests: response.data.interests, website: response.data.website, timezone: response.data.timezone, full_name: response.data.full_name, formatted_created_at: response.data.formatted_created_at, formatted_last_seen: response.data.formatted_last_seen, album_count: response.data.album_count, total_unread_message_count: response.data.total_unread_message_count, }; // 将userData存储到会话中 session.user = userData }).catch((error) => { // 错误 if (error.response) { // 请求已经发出,但服务器响应的状态码不在2xx的范围内 // console.log(error.response.data); // console.log(error.response.status); // console.log(error.response.headers); console.log('error.response: ' + error.request); } else if (error.request) { // 请求已经发出,但没有收到响应 // `error.request`是在浏览器中是一个XMLHttpRequest实例,在node.js中是一个http.ClientRequest实例 console.log('error.request: ' + error.request); } else { // 设置请求时发生了错误 console.log('Error', error.message); } console.log(error.config); }); return session } } const options = { providers, callbacks, session: { // 使用JSON Web Tokens代替数据库会话。 // 这个选项可以在有或没有用户/账户数据库的情况下使用。 // 注意:如果没有指定数据库,`jwt`会自动设置为`true`。 jwt: true, // 秒 - 空闲会话过期并且不再有效的时间。 maxAge: 30 * 24 * 60 * 60, // 30天 // 秒 - 限制写入数据库以延长会话的频率。 // 使用它来限制写操作。将其设置为0以始终更新数据库。 // 注意:如果使用JSON Web Tokens,则忽略此选项 updateAge: 24 * 60 * 60, // 24小时 }, secret: process.env.SECRET, jwt: { // signingKey: process.env.JWT_SIGNING_PRIVATE_KEY, // // // 如果使用公钥/私钥进行验证,还可以指定公钥以进行验证(仅使用私钥也可以) // verificationKey: process.env.JWT_SIGNING_PUBLIC_KEY, // // // 如果您想使用除HS512之外的其他密钥格式,可以指定自定义选项来使用 // // 进行验证(注意:verificationOptions还应包含maxTokenAge的值)。 // // verificationOptions = { // // maxTokenAge: `${maxAge}s`, // 例如`${30 * 24 * 60 * 60}s` = 30天 // // algorithms: ['HS512'] // // }, secret: process.env.JWT_SECRET, }, pages: { error: '/login' // 将错误重定向页面更改为我们自定义的登录页面 } } export default (req, res) => NextAuth(req, res, options)
我在网上找到的所有教程只展示了login/signIn
,没有详细说明如何实现registration
。