Jugador Josu
import * as Yup from 'yup';
import User from '../models/User';
class UserController {
async store(req, res) {
const schema = Yup.object().shape({
name: Yup.string().required(),
email: Yup.string()
.email()
.required(),
password: Yup.string()
.required()
.min(6),
});
if (!(await schema.isValid(req.body))) {
return res.status(400).json({ error: 'Validation fails' });
}
const userExists = await User.findOne({ where: { email: req.body.email } });
if (userExists) {
return res.status(400).json({ error: 'User already exists.' });
}
const { id, name, email, provider } = await User.create(req.body);
return res.json({ id, name, email, provider });
}
async update(req, res) {
const schema = Yup.object().shape({
name: Yup.string(),
email: Yup.string().email(),
oldPassword: Yup.string().min(6),
password: Yup.string()
.min(6)
.when('oldPassword', (oldPassword, field) =>
oldPassword ? field.required() : field
),
confirmPassword: Yup.string().when('password', (password, field) =>
password ? field.required().oneOf([Yup.ref('password')]) : field
),
});
if (!(await schema.isValid(req.body))) {
return res.status(400).json({ error: 'Validation fails' });
}
const { email, oldPassword } = req.body;
const user = await User.findByPk(req.userId);
if (user.email !== email) {
const userExists = await User.findOne({
where: { email },
});
if (userExists) {
return res.status(400).json({ error: 'User already exists.' });
}
}
if (oldPassword && !(await user.checkPassword(oldPassword))) {
return res.status(401).json({ error: 'Password does not match.' });
}
const { id, name, provider } = await user.update(req.body);
return res.json({ id, name, email, provider });
}
}
export default new UserController();
Aquí crea un usuario normal con la contraseña 123456:
Aquí debería funcionar, ya que la contraseña anterior es la misma que la contraseña del usuario creado, y debería actualizar la nueva contraseña:
Quiero tratar de entender cómo hacerle entender la contraseña actual como contraseña anterior y actualizar la contraseña.
Probar esto:
import * as Yup from 'yup';
validationSchema: Yup.object({
password: Yup.string().required('Password is required'),
passwordConfirmation: Yup.string()
.oneOf([Yup.ref('password'), null], 'Passwords must match')
});
-
actualmente con esto, cuando cambio una de las entradas, solo se valida la que se está cambiando, lo que significa que necesito cambiar ambas para tener el estado adecuado, ¿hay alguna forma de forzar que ambas se verifiquen al cambiar una?
– Renán Souza
11 de noviembre de 2020 a las 15:48
-
@RenanSouza puede usar el método test() en su lugar.
Yup.object({ password: Yup.string().required('Password is required'), passwordConfirmation: Yup.string() .test('passwords-match', 'Passwords must match', function (value) { return this.parent.password === value }) })
– Hammed Oyedele
13 de noviembre de 2020 a las 13:59
-
@HammedOyedele, cree una publicación en lugar de un comentario para que podamos votarlo y quizás ser seleccionados como la mejor respuesta.
– Telmo Días
14 de noviembre de 2020 a las 23:14
-
Es posible que también tengan que poner otra opción requerida para la confirmación de contraseña.
Yup.object().shape({ password: Yup.string().required('Password is required'), passwordConfirmation: Yup.string() .required('Confirm password is required') .oneOf([Yup.ref('password'), null], 'Passwords must match'), });
– Chathuranga Kasthuriarachchi
15 de diciembre de 2021 a las 5:13
-
agregaría un
.required()
apasswordConfirmation
y quitar elnull
valor. De lo contrario, el formulario es válido al salir delpasswordConfirmation
campo vacío.– Behemoth
3 sep 2022 a las 10:44
Hammed Oyedele
Según la respuesta de @anoNewb y la solicitud realizada por @Renan,
Yup.object({
password: Yup.string().required('Password is required'),
passwordConfirmation: Yup.string()
.test('passwords-match', 'Passwords must match', function(value){
return this.parent.password === value
})
})
-
El problema con esta solución es que se llama para cada entrada, no solo para cambios de
passwordConfirmation
, y el valor que se pasa es de esa entrada. entonces, por ejemplo, esto falla:– pupo162
30 de septiembre de 2021 a las 9:32
Así es como lo hice.
yup.object({
password: yup
.string()
.required('Please enter your password.')
.min(8, 'Your password is too short.'),
retypePassword: yup
.string()
.required('Please retype your password.')
.oneOf([yup.ref('password')], 'Your passwords do not match.')
});
onSubmit={(values)=>{
const {confirmPassword,...data}=values;
console.warn(data)
}}
Parece en la última versión de Yup. Sí ^ 1.0.0
Ya no necesitas pasar null
como segundo argumento para yup.ref
donde van los argumentos de opciones: documentos.
Así es como probaría la contraseña de confirmación:
import * as Yup from 'yup';
validationSchema: Yup.object({
password: Yup.string().required('Password is required').matches(
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*[\]{}()?"\\,><':;|_~`=+-])[a-zA-Z\d!@#$%^&*[\]{}()?"\\,><':;|_~`=+-]{12,99}$/,
'Must contain at least 12 Characters, 1 Uppercase, 1 Lowercase, 1 Special Character, and 1 Number'
),
passwordConfirmation: Yup.string()
.oneOf([Yup.ref('password')], 'Passwords must match')
});
Nota: he añadido un extra.matches()
regex en la solución en cuanto a la seguridad, la mayoría de los sitios usan algún tipo de validación de contraseña.