Next使用外部Node.js API进行身份验证

jv4diomz  于 2023-05-06  发布在  Node.js
关注(0)|答案(2)|浏览(171)

我正在使用Next Auth,并运行了一个独立的Node.js API。我正在使用Next Auth使用凭据并使用axios将用户名和密码发送到API。
在API端,如果用户名和密码正确,我使用express-session设置一个会话并将其保存到数据库。
如果Next.js中的响应状态为201,我想将API中的express-session令牌添加到我的Next.js会话中。
下面的代码是工作在我身份验证,当我console.log会话在受保护的网页,我看到的express-session令牌,是在服务器上设置。该令牌也存储在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;
    },
  },
});
jobtbby3

jobtbby31#

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
      },
    },
  })
k5ifujac

k5ifujac2#

如果我需要在受保护的页面上发出API请求,那么我是否会根据登录用户的数据库令牌检查会话令牌?
是的,你需要检查那个会话,但从我所理解的,会话的检查只是 * 验证 * 令牌。因此无需查询数据库。
最后,JWT在这里的位置,这是Next.js使用JWT处理客户端认证会话的方式吗?
该验证是通过JWT完成的。基本上,JWT会确保您发送的令牌与它创建的令牌相同
注意:我唯一不了解的是角色权限。JWT令牌可以告诉你用户是否经过身份验证。但是如果你从 Jmeter 板管理面板更新用户角色,比如说从 activeinactive,那么在API的某个时候,你需要请求数据库检查用户的角色。我认为在这种情况下我们不能依靠代币

相关问题