Next-Auth:如何使用电子邮件+密码凭据提供程序处理注册?

6 浏览
0 Comments

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

0