NextAuth 会话回调未触发

Sam*_*uel 7 next.js aws-amplify next-auth

Nextjs通过 AWS Amplify 部署了一个 (v13) 应用程序并使用NextAuth(v4.17.0)。我正在使用CredentialsProvider自定义服务器。在开发环境中一切都很好,但在生产中,session即使在数据库中创建了令牌,回调也不会触发并且会话为空

/page/api/auth/[...nextauth].tsx 忽略控制台日志哈哈

import NextAuth from "next-auth";
import CredentialsProvider from "next-auth/providers/credentials";
import jwt_decode from "jwt-decode";
import { TokenInfo } from "../../../components/types/auth_types";


async function refreshAccessToken(token) {
    try {
        console.log("BUT WHY?");

        const res = await fetch(
            `${process.env.NEXT_PUBLIC_API_URL}/api/token/refresh/`,
            {
                method: "POST",
                body: JSON.stringify({refresh: token.refreshToken}),
                headers: {"Content-Type": "application/json"},
            }
        );

        if (!res.ok) throw "refreshError";
        const responseJson = await res.json();
        return {
            ...token,
            accessToken: responseJson.access,
        }

    } catch(error) {
        return {
            ...token,
            error: "RefreshAccessTokenError",
        }
    }
}

export const authOptions = {
    providers: [
        CredentialsProvider({
            id: "credentials",
            name: "Credentials",
            credentials: {
                email: { label: "Username", type: "text", placeholder: "" },
                password: { label: "Password", type: "password" }
            },
            async authorize(credentials, req) {
                const userCredentials = {
                    email: credentials.email, password: credentials.password
                };
                try {
                    const res = await fetch(
                        `${process.env.NEXT_PUBLIC_API_URL}/api/token/`,
                        {
                            method: "POST",
                            body: JSON.stringify(userCredentials),
                            headers: {"Content-Type": "application/json"},
                            credentials: "include",
                        }
                    );
                    console.log("res", res);
                    if (res.ok) {
                        const responseJson = await res.json();
                        console.log("resJson", responseJson);
                        const tokenInfo: TokenInfo = jwt_decode(responseJson.access);
                        console.log("tokenInfo", tokenInfo);
                        return {
                            id: tokenInfo.user_id.toString(),
                            email: tokenInfo.email,
                            firstName: tokenInfo.first_name,
                            lastName: tokenInfo.last_name,
                            isStaff: tokenInfo.is_staff,
                            accessToken: responseJson.access,
                            refreshToken: responseJson.refresh,
                        };
                    }
                    return null;
                } catch(e) {
                    return null;
                }
            }
        })
    ],
    callbacks: {
        async jwt({ token, account, user }) {
            if (account && user) {
                console.log("got into token", user);
                
                token.firstName = user.firstName;
                token.lastName = user.lastName;
                token.refreshToken = user.refreshToken;
                token.accessToken = user.accessToken;
            }
            if (token.accessToken) {
                console.log("got in this if instead")
                const decodedToken: TokenInfo = jwt_decode(token.accessToken);
                if (Date.now() < decodedToken.exp * 1000) {
                    console.log("got here, returned properly");
                    return token;
                }
            }
            console.log("got here, not properly, why?");
            return await refreshAccessToken(token);
        },
        async session({ session, token }) {
            console.log("getting session");
            session.user.firstName = token.firstName;
            session.user.lastName = token.lastName;
            session.accessToken = token.accessToken;
            console.log("sess", session);
            return session;
        }
    },
    secret: process.env.NEXT_AUTH_SECRET,
    session: {
        maxAge: 2 * 24 * 60 * 60,  // two days
    }
};

export default NextAuth(authOptions);
Run Code Online (Sandbox Code Playgroud)

我已经尽我所能地进行了搜索,但找不到任何我没有做过的事情。

我的理解是我不需要设置,session: { strategy: "jwt"}因为这是默认的。

我已正确设置NEXT_AUTH_SECRET="mysecret",并且 API 调用成功,并且调用返回状态代码,Amplify 日志中没有错误NEXT_PUBLIC_API_URL="https://www.backend_domain.com"NEXTAUTH_URL="https://www.frontend_domain.com".env.productionNextAuth200

编辑1:

如果我导航到/api/auth/signin/credentials并使用默认 UI 进行登录,则会话将成功创建