如何使用next-auth在Next.js中实现凭证授权?

问题描述

我尝试使用next-auth获取凭据身份验证,但是我没有使用它的经验,无论我做什么,我都会收到以下消息: [next-auth][error][callback_credentials_jwt_error] Signin in with credentials is only supported if JSON Web Tokens are enabled https://next-auth.js.org/errors#callback_credentials_jwt_error 。 也许结果是一团糟,但我希望你能帮助我。

这是我的src / pages / api / auth / [... nextauth] .js文件

import NextAuth from 'next-auth'
import Providers from 'next-auth/providers'
import User from "@models/User"

const options = {
    NEXTAUTH_URL:process.env.NEXTAUTH_URL,providers: [
        Providers.Credentials({
            // The name to display on the sign in form (e.g. 'Sign in with...')
            name: 'Avista',// The credentials is used to generate a suitable form on the sign in page.
            // You can specify whatever fields you are expecting to be submitted.
            // e.g. domain,username,password,2FA token,etc.

            credentials: {
                email: {label: "Email",type: "text"},password: {label: "Password",type: "password"}
            },authorize: async (credentials) => {
                // Add logic here to look up the user from the credentials supplied
                // const user = {id: 1,name: 'J Smith',email: 'jsmith@example.com'}
                const user = await User.findOne()
                console.log("Данные входа",credentials)

                if (user) {
                    // Any object returned will be saved in `user` property of the JWT
                    return Promise.resolve(user)
                } else {
                    // If you return null or false then the credentials will be rejected
                    return Promise.resolve(null)
                    // You can also Reject this callback with an Error or with a URL:
                    // return Promise.reject(new Error('error message')) // Redirect to error page
                    // return Promise.reject('/path/to/redirect')        // Redirect to a URL
                }
            }
        }),Providers.Email({
            server: {
                host: process.env.EMAIL_SERVER_HOST,port: process.env.EMAIL_SERVER_PORT,auth: {
                    user: process.env.EMAIL_SERVER_USER,pass: process.env.EMAIL_SERVER_PASSWORD
                }
            },from: process.env.EMAIL_FROM
        }),],// A database is optional,but required to persist accounts in a database
    database: process.env.MONGO_URI,secret: process.env.JWT_SIGNING_PRIVATE_KEY,},}

我不知道我做错了什么。我可以获得有关此主题的更多信息。

解决方法

尝试将其添加到您的[... nextauth] .js页面

  session: {
    jwt: true,// Seconds - How long until an idle session expires and is no longer valid.
    maxAge: 30 * 24 * 60 * 60,// 30 days
  },

在此处详细了解选项:https://next-auth.js.org/configuration/options#jwt