محمود سعداوي2 نشر 2 أكتوبر 2023 أرسل تقرير نشر 2 أكتوبر 2023 السلام عليكم. أريد تغيير كلمة المرور بالمستخدم الحالي. قمت بالكود التالي في طرف الخادم // Change Password const changePassword = async(req,res) => { const errors = validationResult(req) if (!errors.isEmpty()) { return res.status(400).json({errors: errors.array()}) } try { const { password, newPassword } = req.body; const id = new mongoose.Types.ObjectId(req.user); const current_user = await User.findOne({ _id: id }); // Check if password is wrong then create error. const matchPassword = await bcrypt.compare( password, current_user.password ); if (!matchPassword) { return res.status(401).send({msg: "كلمة المرور خاطئة"}) } // Update password. const salt = await bcrypt.genSalt(10); const hashNewPassword = await bcrypt.hash(newPassword, salt) current_user.password = hashNewPassword; await current_user.save() res.send(res.json({ success: true, data: current_user })) } catch (error) { res.status(500).send({msg: error.message}); } } في طرف العميل const navigate = useNavigate() const [error, setError] = useState('') const [changePassward, setChangePassward] = useState({ password: '', newPassword: '' }) const { password, newPassword } = changePassward const onChange = (e) => { setChangePassward({...changePassward, [e.target.name]: e.target.value}) } const onSubmit = (e) => { e.preventDefault(); const user = JSON.parse(localStorage.getItem("user")); // console.log(user?.data?.token); axios .post("/api/auth/change_password", changePassward, { headers: { "Content-Type": "application/json", "x-auth-token": user?.data?.token, }, }) .then((res) => { setChangePassward(res.data) navigate("/", { replace: true }) }) .catch((err) => setError(err.response.data.message)); }; الوسائط (middleware) const protect = (req, res, next) => { // Get token from header const token = req.header('x-auth-token') // Check if no token if (!token) { return res.status(401).json({msg: 'No token, authorization denied!'}) } // Verify token try { const decoded = jwt.verify(token, process.env.JWT_SECRET) req.user = decoded.user next() } catch (err) { res.status(401).json({msg: 'Token is not valid'}) } } المتصفح يخبرني برسالة الخطأ التالية POST http://localhost:3000/api/auth/change_password 401 (Unauthorized) عند إستخدام postman لم ألاحظ أي مشاكل 1 اقتباس
0 Mustafa Suleiman نشر 2 أكتوبر 2023 أرسل تقرير نشر 2 أكتوبر 2023 رسالة "401 Unauthorized" تعني أن الطلب لم يتم تصديقه بنجاح عند إرساله إلى الخادم، أي أن الـ JWT (JSON Web Token) الذي تم إرساله مع الطلب غير صالح أو غير موجود. عليك بالتالي: تأكد من أنك قمت بتسجيل الدخول بنجاح وحصلت على JWT الصحيح عند تسجيل الدخول. التأكد من أنك تقوم بإرسال الـ JWT الصحيح مع الطلب، وأنت تقوم بذلك بالفعل في كود العميل باستخدام: "x-auth-token": user?.data?.token وتحقق من أن خادمك يستخدم نفس (JWT_SECRET) الذي تم استخدامه عند إنشاء الـ JWT ويجب أن يكون متطابقًا على الجانبين (الخادم والعميل) حتى يمكن التحقق من الـ JWT بنجاح. وقم بتضمين وسيط الحماية (protect) في مسار الطلب /api/auth/change_password للتحقق من الـ JWT قبل تنفيذ العملية وتأكد من أن الوسيط موجود في سلسلة وسائط التوجيه التي تتعامل مع هذا المسار. أيضًا تحقق من الجزء التالي في الكود: await current_user.save() res.send(res.json({ success: true, data: current_user })) عليك أيضًا إزالة res.json() حيث أن res.send() بالفعل يقوم بإرسال الجواب بصيغة JSON. 1 اقتباس
0 محمود سعداوي2 نشر 2 أكتوبر 2023 الكاتب أرسل تقرير نشر 2 أكتوبر 2023 بتاريخ 56 دقائق مضت قال محمود سعداوي2: res.send(res.json({ success: true, data: current_user })) المشكل هنا يجب أن يتحول الكود كالآتي res.status(200).json({ success: true, data: current_user }); أجبت بعد أن وجدت الحل لتعم المنفعة الجميع. اقتباس
السؤال
محمود سعداوي2
السلام عليكم.
أريد تغيير كلمة المرور بالمستخدم الحالي.
قمت بالكود التالي
في طرف الخادم
// Change Password const changePassword = async(req,res) => { const errors = validationResult(req) if (!errors.isEmpty()) { return res.status(400).json({errors: errors.array()}) } try { const { password, newPassword } = req.body; const id = new mongoose.Types.ObjectId(req.user); const current_user = await User.findOne({ _id: id }); // Check if password is wrong then create error. const matchPassword = await bcrypt.compare( password, current_user.password ); if (!matchPassword) { return res.status(401).send({msg: "كلمة المرور خاطئة"}) } // Update password. const salt = await bcrypt.genSalt(10); const hashNewPassword = await bcrypt.hash(newPassword, salt) current_user.password = hashNewPassword; await current_user.save() res.send(res.json({ success: true, data: current_user })) } catch (error) { res.status(500).send({msg: error.message}); } }
في طرف العميل
const navigate = useNavigate() const [error, setError] = useState('') const [changePassward, setChangePassward] = useState({ password: '', newPassword: '' }) const { password, newPassword } = changePassward const onChange = (e) => { setChangePassward({...changePassward, [e.target.name]: e.target.value}) } const onSubmit = (e) => { e.preventDefault(); const user = JSON.parse(localStorage.getItem("user")); // console.log(user?.data?.token); axios .post("/api/auth/change_password", changePassward, { headers: { "Content-Type": "application/json", "x-auth-token": user?.data?.token, }, }) .then((res) => { setChangePassward(res.data) navigate("/", { replace: true }) }) .catch((err) => setError(err.response.data.message)); };
الوسائط (middleware)
const protect = (req, res, next) => { // Get token from header const token = req.header('x-auth-token') // Check if no token if (!token) { return res.status(401).json({msg: 'No token, authorization denied!'}) } // Verify token try { const decoded = jwt.verify(token, process.env.JWT_SECRET) req.user = decoded.user next() } catch (err) { res.status(401).json({msg: 'Token is not valid'}) } }
المتصفح يخبرني برسالة الخطأ التالية
POST http://localhost:3000/api/auth/change_password 401 (Unauthorized)
عند إستخدام postman لم ألاحظ أي مشاكل
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.