اذهب إلى المحتوى

السؤال

نشر

السلام عليكم.

أريد تغيير كلمة المرور بالمستخدم الحالي.

قمت بالكود التالي

في طرف الخادم

// 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.thumb.JPG.6084b91549a15fe233c8a33c59b6d4c9.JPG2.thumb.JPG.8aa92f15d9d33fa5dcaa6541e93409cd.JPG

Recommended Posts

  • 0
نشر

رسالة "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.
 

  • 0
نشر
بتاريخ 56 دقائق مضت قال محمود سعداوي2:
res.send(res.json({
            success: true,
            data: current_user
        }))

المشكل هنا

يجب أن يتحول الكود كالآتي

res.status(200).json({
    success: true,
    data: current_user
});

أجبت بعد أن وجدت الحل لتعم المنفعة الجميع.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...