You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NextAuth JWT与Session回调配置失败,请求技术帮助

配置NextAuth JWT认证的问题汇总

我正在配置NextAuth的JWT认证,目标是让后端能访问JWT,同时给Session添加额外字段,但按标准配置尝试数小时仍未成功,遇到以下问题:

  • 调试时出现**「jwt required」、「checks.state参数缺失」**错误
  • TypeScript类型错误:session.strategy的string类型无法赋值给SessionStrategy类型,尽管文档明确说明应传入字符串

我的authOptions配置

export const authOptions = {
    // Configure one or more authentication providers
    providers: [
        EmailProvider({
            server: {
                host: config.authProviders.email.host,
                port: config.authProviders.email.port,
                auth: {
                    user: config.authProviders.email.user,
                    pass: config.authProviders.email.password,
                }
            },
            from: config.authProviders.email.from,
        }),
        GoogleProvider({
            clientId: config.authProviders.google.id ? config.authProviders.google.id : "",
            clientSecret: config.authProviders.google.secret ? config.authProviders.google.secret : "",
        }),
        FacebookProvider({
            clientId: config.authProviders.facebook.id ? config.authProviders.facebook.id : "",
            clientSecret: config.authProviders.facebook.secret ? config.authProviders.facebook.secret : "",
        }),
    ],
    adapter: MongoDBAdapter(clientPromise),
    secret: process.env.NEXTAUTH_SECRET,


    pages: {
        signIn: '/login/signin',
        signOut: '/',
    },


    session: {
        strategy: "jwt",
    },

    jwt: {
        maxAge: 30 * 24 * 60 * 60, // 30 days

        // async encode({ token, secret }: { token: typeof JWT; secret: string }) {
        //     const jwt = require("jsonwebtoken");
        //     const encodedToken = jwt.sign(token, secret);
        //     return encodedToken;
        // },
        // async decode({ token, secret }: { token: typeof JWT; secret: string }) {
        //     const jwt = require("jsonwebtoken");
        //     const decodedToken = jwt.verify(token, secret);
        //     return decodedToken;
        // },


        async encode() { },
        async decode() { },

    },

    // This is for jwt stuff?
    callbacks: {
        async signIn({ user, account, profile, email, credentials }: { user: Object; account: Object; profile: Object; email: Object; credentials: Object }) {
            return true
        },

        async redirect({ url, baseUrl }: { url: string; baseUrl: string }) {
            return baseUrl
        },
        async jwt({ token, account, profile, session }: any) {

            console.log({ jwt: { token, account, profile, session } })
            return token
        },

        async session({ session, token, user }: any) {

            console.log({ sessionEx: { session, token, user } });
            return session;

        },


    },
}

export default NextAuth(authOptions)

登录页面代码

import { signIn, useSession, signOut } from 'next-auth/react'
import { useState, } from 'react';
import Link from 'next/link';
import { useRouter } from 'next/router';
import { BsGoogle, BsFacebook } from 'react-icons/bs';

interface Props {

}


const SignInForm: React.FC<Props> = () => {

    const [email, setEmail] = useState('');

    const { data: session, status } = useSession();
    console.log({ session, status });
    const providers = [
        {
            name: 'Google',
            Icon: BsGoogle,
        },
        {
            name: 'Facebook',
            Icon: BsFacebook,
        },
    ]

    const handleSignIn = async (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
        e.preventDefault();
        await signIn('email', { email, })
        // push(asPath)
    }

    const handleAuthSignIn = async (name: string) => {
        // make name all lowercase
        name = name.toLowerCase();
        await signIn(name)
    }

    if (!session) {
        return (
            <div className='relative bg-white border-2 border-black rounded-md '>
                {/* <div className='relative border-8 rounded-md bg-myDarkBlue border-myDarkRed '> */}
                <form className="py-5 px-7">
                    <div className="mb-4">
                        <input
                            className="w-full px-3 py-2 leading-tight text-gray-700 border rounded shadow appearance-none outline-1 focus:outline-myRed focus:shadow-outline"
                            id="email" type="email" placeholder="Email" value={email} onChange={(e) => setEmail(e.target.value)} />
                    </div>

                    <div className="flex items-center justify-between mb-3">
                        <button
                            className="px-4 py-2 font-bold text-white rounded bg-myGreen hover:bg-green-700 focus:outline-none focus:shadow-outline"
                            type="button" onClick={(e) => { handleSignIn(e) }}>
                            Sign In
                        </button>
                        <a className="inline-block text-sm font-bold align-baseline text-myBlue hover:text-myDarkBlue"
                            href="#">
                            Need Help?
                        </a>
                    </div>

                    <div className="grid grid-flow-row grid-row">
                        {providers.map(({ name, Icon }, index) => {
                            return (
                                <div key={`${name} ${index}`} className='flex justify-start p-3 my-1 bg-white border rounded hover:border-myRed hover:cursor-pointer' onClick={() => { handleAuthSignIn(name) }}>
                                    <Icon className='m-3 ' />
                                    <p className='m-3 text-base '>Login with {name}</p>
                                </div>)
                        })}
                    </div>
                </form>
            </div>
        )
    } else {
        return (
            <div className=' bg-slate-300'>
                <Link href='/'>
                    <p className='text-xl text-center align-middle'>You are already signed in silly <span className='text-myBlue hover:text-myDarkBlue'>click to go Home</span></p>
                </Link>
                <div className='cursor-pointer text-myBlue hover:text-myDarkBlue' onClick={() => signOut({ callbackUrl: 'http://localhost:3000/' })}>Or sign out</div>
            </div>
        )
    }
}

export default SignInForm;

复现步骤

  • 使用上述authOptions创建NextAuth配置文件
  • 创建对应自定义登录路由

内容的提问来源于stack exchange,提问作者Wayne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 00:05:21