当前位置:   article > 正文

学习笔记-WEB-全栈框架Nextjs之用户认证Auth_在nextjs14项目中,使用 auth.js框架,采用credentials认证方式时,用户名或密

在nextjs14项目中,使用 auth.js框架,采用credentials认证方式时,用户名或密码错误

Auth.js

安装略

配置环境变量

其中secret可以使用openssl命令生成

openssl rand -base64 32

申请第三方认证接口

获得client id和client secrets,并配置到环境变量中的GITHUB_ID和GITHUB_SECRET

基本使用

创建登录登出端点,可以在lib下创建并在对应的api router中暴露,也可以直接在api router中创建

/lib/auth.js

  1. export const {
  2. handlers: { GET, POST },
  3. auth,
  4. signIn,
  5. signOut,
  6. } = NextAuth({
  7. ...authConfig,
  8. providers: [
  9. GitHub({
  10. clientId: process.env.GITHUB_ID,
  11. clientSecret: process.env.GITHUB_SECRET,
  12. }
  13. ...

/api/[...nextauth]/route.js

login page

操作数据库

在provider后面增加callback

密码hash

npm i bcryptjs

添加CredentialsProvider

  1. const login = async (credentials) => {
  2. try {
  3. connectToDb();
  4. const user = await User.findOne({ username: credentials.username });
  5. if (!user) throw new Error("Wrong credentials!");
  6. const isPasswordCorrect = await bcrypt.compare(
  7. credentials.password,
  8. user.password
  9. );
  10. if (!isPasswordCorrect) throw new Error("Wrong credentials!");
  11. return user;
  12. } catch (err) {
  13. console.log(err);
  14. throw new Error("Failed to login!");
  15. }
  16. };
  17. export const {
  18. handlers: { GET, POST },
  19. auth,
  20. signIn,
  21. signOut,
  22. } = NextAuth({
  23. ...authConfig,
  24. providers: [
  25. GitHub({
  26. clientId: process.env.GITHUB_ID,
  27. clientSecret: process.env.GITHUB_SECRET,
  28. }),
  29. CredentialsProvider({
  30. async authorize(credentials) {
  31. try {
  32. const user = await login(credentials);
  33. return user;
  34. } catch (err) {
  35. return null;
  36. }
  37. },
  38. }),
  39. ],
  40. callbacks: {
  41. async signIn({ user, account, profile }) {
  42. if (account.provider === "github") {
  43. connectToDb();
  44. try {
  45. const user = await User.findOne({ email: profile.email });
  46. if (!user) {
  47. const newUser = new User({
  48. username: profile.login,
  49. email: profile.email,
  50. image: profile.avatar_url,
  51. });
  52. await newUser.save();
  53. }
  54. } catch (err) {
  55. console.log(err);
  56. return false;
  57. }
  58. }
  59. return true;
  60. },
  61. ...authConfig.callbacks,
  62. },
  63. });

重定向错误

当使用await signIn("credentials", { username, password });进行登录的时候会触发重定向错误,这是nextjs redirect的一个问题,可以通过抛出这个错误而非return来规避。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/950160
推荐阅读
相关标签
  

闽ICP备14008679号