使用外部 Node.js API 进行下一步身份验证

use*_*989 7 next.js next-auth

我正在使用 Next Auth 并运行一个独立的 Node.js API。我正在使用使用凭证的 Next Auth 并使用 axios 将用户名和密码发送到 API。

在 API 方面,如果用户名和密码正确,我将使用 express-session 设置会话并将其保存到数据库中。

如果 Next.js 中的响应状态为 201,我想将 API 中的快速会话令牌添加到我的 Next.js 会话中。

下面的代码正在工作,我进行身份验证,当我在受保护的页面中进行 console.log 会话时,我看到在服务器上设置的快速会话令牌。该令牌也存储在 mongoDB 中。但这是正确的吗?这样做的目的只是为了保护前端的路由,即:检查 Next.js 中是否有会话

如果在受保护的页面上我需要发出 API 请求,我是否会根据登录用户的数据库令牌检查该会话令牌?

最后,JWT 在这里适合什么,这是 Next.js 使用 JWT 处理客户端身份验证会话的方式吗?

    import NextAuth from "next-auth";
    import CredentialsProvider from "next-auth/providers/credentials";
    import axios from "axios";
    export default NextAuth({
      session: {
        jwt: true,
        maxAge: 30 * 24 * 60 * 60,
      },
      providers: [
        CredentialsProvider({
          async authorize(credentials) {
            try {
              const response = await axios.post(`http://localhost:8000/login`, {
                email: credentials.email,
                password: credentials.password,
              });
    
              if (response.status === 201) {
                const user = {
                  email: credentials.email,
                  accessToken: response.data.token,
                };
                return user;
              } else {
                return null;
              }
            } catch (err) {
              console.log(err.response);
            }
          },
        }),
      ],
      callbacks: {
        async jwt({ token, user }) {
          if (user) {
            token.accessToken = user.accessToken;
          }
          return token;
        },
        async session({ session, token, user }) {
          session.accessToken = token.accessToken;
          return session;
        },
      },
    });
Run Code Online (Sandbox Code Playgroud)

Vii*_*ual 3

export default NextAuth({
    providers: [
      CredentialsProvider({
        name: 'Credentials',
        credentials: {
          username: {label: 'Username', type: 'text', placeholder: 'email@site.com'},
          password: {label: 'Password', type: 'password', placeholder: 'password'},
        },
        async authorize({username, password}, _req) {
          try {
            const {data, error} = await fetch("<your-remote-api>")
            if (!data?.user || error) {
              return null
            }
            return data.user
          } catch (error) {
            return error
          }
        },
      }),
    ],
    callbacks: {
      jwt: async ({token, user}) => {
        if (user) {
          token.data = user
        }
        return token
      },
      session: async ({session, token}) => {
        if (token.data) {
          session.user = token.data
        }
        return session
      },
    },
  })
Run Code Online (Sandbox Code Playgroud)