如何从 Strapi 获取用户密码?

问题描述 投票:0回答:1

我只是不知道如何获取该用户密码作为回报,所以我可以在登录表单上创建我的 bcrypt.compare 逻辑。

对于注册,我使用下一个逻辑和端点:

  • /api/auth/local/register

我尝试过:

  • /auth/login + 填充 + 填充深度插件
  • /api/users/me - 我猜它不会返回密码字段以确保安全

我想我需要以某种方式修改控制器,并创建自定义端点以从 Strapi 获取该数据,但我没有找到任何与此相关的信息,而且我根本没有这样做。

也没有找到该信息,因为每个人似乎都想更改密码,而我不需要更改它,我只是想要那个哈希值,这样我就可以比较它,仅此而已。

看来我将被迫在 Strapi 中创建控制器,我可以调用它来验证用户密码(传递用户 - 他找到他 - 检查 - 响应)。我猜是因为在安全问题上将密码返回到前面。但问题来了,如何创建该控制器? 如果您对我如何获取符合我的逻辑的密码有任何建议 - 我会很高兴看到这一点。

“@strapi/strapi”:“^4.21.1”,

import { NextResponse } from 'next/server'
import { z } from 'zod'
import isEmail from 'validator/lib/isEmail'
import { comparePassword } from '@/utils/password-compare'
import { Codes } from '@/constants/code-errors'

export async function POST(request) {
  try {
    const { email, password } = await request.json()
    const saltRounds = 10;
    // http://localhost:8080/api/auth/local
    // const response = await fetchBackendAPI({
    //     resource: '/api/admin/login',
    //     method: 'POST',
    //     fields: nonEmptyFields
    //   })

    const emailCheck = z.string().refine(isEmail)

    if (!emailCheck.safeParse(email).success) {
      return NextResponse.json({ message: "Email is incorrect." }, { status: 404 });
    }

    const hashResult = await comparePassword(password, saltRounds)

    if (hashResult !== false) {
      // Save hashed password
    } else {
      // Error handling
    }

    const response = await fetch(`${process.env.REACT_APP_API_ENDPOINT}/api/auth/local`, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        identifier: email,
        password: hashResult,
      })
    })

    if (response.ok) {
      console.log("User was logged")
      const newUser = await response.json();
      return NextResponse.json({ newUser }, { status: 200 });
    } else {
      console.log("Response is not ok")
      return NextResponse.json({
        code: response.status,
        message: response.statusText
      }, { status: response.status })
    }

  } catch (err) {
    return NextResponse.json({
      code: Codes.INTERNAL_SERVER_ERROR.code,
      err: Codes.INTERNAL_SERVER_ERROR.message
    }, { status: 500 })
  }
}

更新:

因为我非常努力地浏览与我的主题相关的所有信息,所以我在 YT 上找到了官方视频,例如如何做控制器,这就是我创建的

    module.exports = {
  routes: [
    {
      method: 'GET',
      path: '/custom',
      handler: 'todo.customAction',
      config: {
        auth: false
      }
    }
  ]
}
    use strict';
    
    /**
     * todo controller
     */
    
    const { createCoreController } = require('@strapi/strapi').factories;
    
    modul

e.exports = createCoreController('api::todo.todo', ({ strapi }) => ({
  async customAction (ctx) {
    try {
      const user = await strapi.query('user', 'users-permissions').findOne({ username: 'Magister4'})
    } catch (err) {
      ctx.body = err
    }
  }
}))

这有点管用,但我无法找到、返回或更改密码。似乎 todo.todo 无法访问主要用户权限的内容。

next.js controller fetch strapi
1个回答
0
投票

要在新 API 中生成新控制器,您只需在 Strapi 项目中运行“yarn Strapigenerate”即可。

然后只需取消注释路线和控制器即可。

然后使用该行获取用户数据

await strapi.db.query('plugin::users-permissions.user').findOne({
  where: { email: email }
})

设置新路由Public,无需授权即可访问。

这是我为您制作的视频中的过程: https://www.loom.com/share/cf60dafff14840c886c6d222530f557b

© www.soinside.com 2019 - 2024. All rights reserved.