【发布时间】:2021-09-20 17:36:39
【问题描述】:
Strapi 有 user-permission 插件,它有一个端点来重置忘记的密码。但我想更改一个已知密码(作为用户),其中不需要发送带有验证令牌的电子邮件。在用户权限插件的 Strapi 文档中,我没有遇到这样的端点。我怎样才能做到这一点?
【问题讨论】:
标签: strapi
Strapi 有 user-permission 插件,它有一个端点来重置忘记的密码。但我想更改一个已知密码(作为用户),其中不需要发送带有验证令牌的电子邮件。在用户权限插件的 Strapi 文档中,我没有遇到这样的端点。我怎样才能做到这一点?
【问题讨论】:
标签: strapi
在检查了user-permission 插件的代码后,我实现了一个更简单的解决方案,而不是扩展插件。为此,我创建了一个自定义控制器(和路由),如下所示:
/api/custom/controllers/custom.js
'use strict';
const _ = require('lodash');
const { sanitizeEntity } = require('strapi-utils');
const sanitizeUser = user =>
sanitizeEntity(user, {
model: strapi.query('user', 'users-permissions').model,
});
module.exports = {
async changePassword(ctx) {
const userFromContext = ctx.state.user;
if (!userFromContext) {
return ctx.badRequest(null, [{ messages: [{ id: 'No authorization header was found' }] }]);
}
const params = _.assign({}, ctx.request.body);
if (
params.currentPassword &&
params.newPassword &&
params.confirmNewPassword &&
params.newPassword === params.confirmNewPassword
) {
const user = await strapi.plugins['users-permissions'].services.user.fetch({
id: userFromContext.id,
}, ['role']);
const validPassword = await strapi.plugins['users-permissions'].services.user.validatePassword(params.currentPassword, user.password);
if (!user) {
return ctx.badRequest('User does not exist');
}
if (!validPassword) {
return ctx.badRequest('Old password does not match.')
}
let updateData = { password: params.newPassword };
const data = await strapi.plugins['users-permissions'].services.user.edit({ id: user.id }, updateData);
return ctx.send(sanitizeUser(data));
}
return ctx.badRequest('New passwords do not match.');
}
};
/api/custom/config/routes.json
{
"routes": [
{
"method": "POST",
"path": "/custom/change-password",
"handler": "custom.changePassword",
"config": {
"policies": []
}
}
]
}
现在我可以使用以下正文向http://localhost:1337/custom/change-password 发布经过身份验证的请求,以便更改登录用户的密码:
{
"currentPassword": "Abcd1234",
"newPassword": "Abcde12345",
"confirmNewPassword": "Abcde12345"
}
【讨论】: