我只是不知道如何获取该用户密码作为回报,所以我可以在登录表单上创建我的 bcrypt.compare 逻辑。
对于注册,我使用下一个逻辑和端点:
我尝试过:
我想我需要以某种方式修改控制器,并创建自定义端点以从 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 无法访问主要用户权限的内容。
要在新 API 中生成新控制器,您只需在 Strapi 项目中运行“yarn Strapigenerate”即可。
然后只需取消注释路线和控制器即可。
然后使用该行获取用户数据
await strapi.db.query('plugin::users-permissions.user').findOne({
where: { email: email }
})
设置新路由Public,无需授权即可访问。
这是我为您制作的视频中的过程: https://www.loom.com/share/cf60dafff14840c886c6d222530f557b