【问题标题】:Seeking pointers to resolve "Cannot read properties of undefined (reading 'jwt')" issue求指点解决\"Cannot read properties of undefined (reading \'jwt\')\"问题
【发布时间】:2023-02-09 05:23:33
【问题描述】:

我的身份验证流程有问题,希望有敏锐眼光的人可以帮助我解决问题。我得到的错误是[next-auth][error][JWT_SESSION_ERROR] https://next-auth.js.org/errors#jwt_session_error Cannot read properties of undefined (reading 'jwt'),此后多次检查代码以查看可能出了什么问题。以下是我采取的步骤,以及如何重现错误:

  1. 如下所示设置和配置[...nextauth].js file
  2. 更新了需要凭据的提供商。

    尝试登录进行测试时,我收到如下所示的错误消息。

    frontend/pages/api/auth/[...nextauth].js

    import NextAuth from "next-auth";
    import GoogleProvider from 'next-auth/providers/google';
    import FacebookProvider from 'next-auth/providers/facebook';
    import EmailProvider from 'next-auth/providers/email';
    
    const options = {
      providers: [
        GoogleProvider({
          clientId: process.env.GOOGLE_CLIENT_ID,
          clientSecret: process.env.GOOGLE_CLIENT_SECRET,
        }),
        FacebookProvider({
          clientId: process.env.FACEBOOK_CLIENT_ID,
          clientSecret: process.env.FACEBOOK_CLIENT_SECRET,
        }),
      ],
      pages: {
        signIn: '/signin',
        signOut: '/',
        error: '/auth/error', // Error code passed in query string as ?error=
        verifyRequest: '/auth/verify-request', // (used for check email message)
        newUser: '/firstpage', // New users will be directed here on first sign in (leave the property out if not of interest)
      },
      secret: process.env.NEXTAUTH_SECRET,
      database: process.env.NEXT_PUBLIC_DATABASE_URL,
      session: {
        jwt: true,
      },
      callbacks: {
        session: async (session, user) => {
          session.jwt = user.jwt;
          session.id = user.id;
          return Promise.resolve(session);
        },
        jwt: async (token, user, account) => {
          const isSignIn = user ? true : false;
          if (isSignIn) {
            const response = await fetch(
              `${process.env.NEXT_PUBLIC_STRAPI_API_URL}/auth/${account.provider}/callback?access_token=${account?.accessToken}`
            );
            const data = await response.json();
            console.log("DATTA",data);
            token.jwt = data.jwt;
            token.id = data.user.id;
          }
          return Promise.resolve(token);
        },
      },
    };
    
    const Auth = (req, res) =>
      NextAuth(req, res, options);
    
    export default Auth;
    

    Error below

    [next-auth][error][JWT_SESSION_ERROR] 
    https://next-auth.js.org/errors#jwt_session_error Cannot read properties of undefined (reading 'jwt') {
      message: "Cannot read properties of undefined (reading 'jwt')",
      stack: "TypeError: Cannot read properties of undefined (reading 'jwt')\n" +
        '    at Object.session (webpack-internal:///(api)/./pages/api/auth/[...nextauth].js:45:32)\n' +
        '    at Object.session (/Users/PATH-TO-FILES...)\n'
    
      name: 'TypeError'
    }
    

【问题讨论】:

    标签: next.js strapi next-auth


    【解决方案1】:

    尝试将 jwt 回调中的 URI 替换为: const response = await fetch( `${process.env.NEXT_PUBLIC_API_URL}/api/auth/${account.provider}/callback?access_token=${account?.access_token}`);

    这是我对[...nextauth].js 的配置。注意:我正在使用 authOptions 而不是 options 以便能够在 getServerSideProps 中的服务器上获得会话。

    import CredentialsProvider from 'next-auth/providers/credentials';
    import GoogleProvider from 'next-auth/providers/google';
    import axios from 'axios';
    
    const authOptions = {
      providers: [
        GoogleProvider({
          clientId: process.env.GOOGLE_CLIENT_ID,
          clientSecret: process.env.GOOGLE_CLIENT_SECRET,
        }),
        CredentialsProvider({
          name: 'Email',
          type: 'credentials',
    
          async authorize(credentials) {
            const { email, password } = credentials;
    
            try {
              const { data } = await axios.post(
                `${process.env.NEXT_PUBLIC_API_URL}/api/auth/local`,
                {
                  identifier: email,
                  password: password,
                }
              );
              const user = await data;
    
              if (user) {
                return user;
              } else {
                return null;
              }
            } catch (err) {
              return null;
            }
          },
        }),
      ],
    
      session: {
        jwt: true,
      },
      secret: process.env.NEXTAUTH_SECRET,
    
      callbacks: {
        async session({ session, token, user }) {
          session.jwt = token.jwt;
          session.id = token.id;
          return session;
        },
        async jwt({ token, user, account }) {
          if (user) {
            if (account.provider !== 'credentials') {
              const response = await fetch(
                `${process.env.NEXT_PUBLIC_API_URL}/api/auth/${account.provider}/callback?access_token=${account?.access_token}`
              );
              const data = await response.json();
    
              token.jwt = data.jwt;
              token.id = data.user.id;
            } else {
              token.jwt = user.jwt;
              token.id = user.user.id;
            }
          }
    
          return token;
        },
      },
    
      pages: {
        signIn: '/auth/signin',
      },
    };
    
    const Auth = (req, res) => NextAuth(req, res, authOptions);
    
    export default Auth;```
    
    
    

    【讨论】:

      猜你喜欢
      • 2021-11-10
      • 2021-11-03
      • 2021-11-08
      • 2022-06-10
      • 2022-06-23
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 2022-07-09
      相关资源
      最近更新 更多