رسائل إعادة تعيين كلمة المرور التي يثق بها المستخدمون (وتصل إلى صندوق الوارد)

أنشئ مسارًا آمنًا لرسالة إعادة تعيين كلمة المرور: رموز لمرة واحدة، وصلاحية قصيرة، ومنع كشف الحسابات، وقالب بريد واضح، ورسالة تأكيد بعد تغيير كلمة المرور.

رسالة إعادة تعيين كلمة المرور هي المفتاح الرئيسي لمنتجك. فأي شخص يستطيع قراءتها يستطيع الاستيلاء على الحساب، ولهذا يستهدفها المهاجمون، ولهذا تعلّم المستخدمون الارتياب منها.

يجب أن يكون مسار إعادة التعيين الجيد آمنًا بما يكفي لصدّ أولئك المهاجمين، وواضحًا بما يكفي ليثق به المستخدمون الحقيقيون في ثوانٍ. يتناول هذا الدليل الجانبين، من لحظة نقر أحدهم على “نسيت كلمة المرور؟” حتى رسالة التأكيد بعد التغيير.

المسار في لمحة

  1. يُدخل المستخدم بريده في صفحة نسيت كلمة المرور.
  2. يعرض تطبيقك دائمًا الرسالة نفسها، سواء كان الحساب موجودًا أم لا.
  3. إن كان موجودًا، تنشئ رمزًا مميّزًا لمرة واحدة وترسل رابط إعادة التعيين بالبريد.
  4. يفتح المستخدم الرابط، ويختار كلمة مرور جديدة، فيُستهلك الرمز.
  5. تسجّل خروج المستخدم من جلساته الأخرى وترسل رسالة “تم تغيير كلمة مرورك”.

الخطوة 1: لا تكشف من لديه حساب

بعد إرسال النموذج، استجب دائمًا بالنص نفسه:

إن كان هناك حساب مرتبط بالعنوان ada@example.com، فقد أرسلنا رابطًا لإعادة تعيين كلمة مرورك. تنتهي صلاحيته خلال 30 دقيقة.

أما عرض “لا يوجد حساب بهذا البريد” فيخبر أي شخص لديه قائمة عناوين بالضبط أيّها يستخدم منتجك. وحافظ على تقارب زمن الاستجابة أيضًا: نفّذ البحث عن الحساب وإرسال البريد في الخلفية، كي لا تستجيب الصفحة أسرع بشكل ملحوظ للعناوين غير المعروفة.

الخطوة 2: أنشئ رمزًا قويًا لمرة واحدة

يجب أن يكون الرمز المميّز في الرابط طويلًا وعشوائيًا ومستحيل التخمين:

import { randomBytes, createHash } from 'node:crypto';

const token = randomBytes(32).toString('base64url');            // goes in the email
const tokenHash = createHash('sha256').update(token).digest('hex'); // goes in the database

await db.passwordResets.upsert({
  userId: user.id,
  tokenHash,
  expiresAt: new Date(Date.now() + 30 * 60 * 1000), // 30 minutes
});

القواعد:

  • لا تخزّن إلا تجزئة الرمز، كي لا يمنح تسرّب قاعدة البيانات روابط إعادة تعيين صالحة.
  • رمز نشط واحد لكل مستخدم. إصدار رمز جديد يحلّ محل القديم.
  • صلاحية قصيرة: من 15 إلى 60 دقيقة هو المعتاد.
  • استخدام لمرة واحدة. احذف الرمز فور تغيير كلمة المرور.
  • أبطِله إن سجّل المستخدم الدخول بنجاح أو غيّر عنوان بريده في هذه الأثناء.

الخطوة 3: أرسل الرسالة فورًا

المستخدم ينتظر، لذا أرسل ضمن الطلب نفسه، لا في مهمة دفعية:

import os
import requests

def send_reset_email(user, token):
    link = f"https://app.yourco.com/reset-password/{token}"
    res = requests.post(
        "https://backend.inbixio.com/api/send-email/",
        headers={"X-API-Key": os.environ["INBIXIO_API_KEY"]},
        json={
            "to_email": user.email,
            "subject": "Reset your YourApp password",
            "message": render_reset_template(name=user.first_name, link=link, minutes=30),
        },
        timeout=10,
    )
    res.raise_for_status()

أرسلها من عنوان مخصّص وموثَّق مثل security@yourco.com. في Inbixio، اربط صندوق البريد هذا خادمَ بريد مستقلًا، وامنح خدمة المصادقة مفتاح API مربوطًا به، لتصل رسائل إعادة التعيين من العنوان الذي يتوقعه المستخدمون. وإن أزلت ذلك الخادم يومًا، فأعد ربط المفتاح. راجع أمان مفاتيح API لإعداد ذلك.

الخطوة 4: اكتب رسالة يثق بها الناس

تحاكي رسائل التصيّد رسائلَ إعادة تعيين كلمة المرور أكثر من أي رسالة أخرى. فاجعل رسالتك لا تُخطئها العين:

  • الموضوع: بسيط ومحدّد، مثل “أعد تعيين كلمة مرورك في YourApp”. بلا استعجال ولا علامات تعجّب.
  • زر واحد واضح، إلى جانب الرابط الكامل نصًّا لبرامج البريد التي تحجب الأزرار.
  • مدة الصلاحية: “تنتهي صلاحية هذا الرابط خلال 30 دقيقة.”
  • السياق: متى قُدّم الطلب، ومن أي متصفح أو مدينة إن توفرت لديك هذه المعلومة.
  • ما يجب فعله إن لم يكن هو من طلبه: “إن لم تطلب إعادة تعيين كلمة مرورك، يمكنك تجاهل هذه الرسالة. لن تتغيّر كلمة مرورك.”
  • لا روابط أو صور أو عروض ترويجية أخرى. كلما قلّت الروابط، سهُل التحقق.
<div style="font-family:system-ui,sans-serif;max-width:520px;margin:auto;color:#111;line-height:1.5">
  <p>Hi Ada,</p>
  <p>We received a request to reset the password for your YourApp account.</p>
  <p style="margin:28px 0">
    <a href="https://app.yourco.com/reset-password/TOKEN"
       style="background:#584efe;color:#fff;padding:12px 20px;border-radius:8px;text-decoration:none;font-weight:600">
      Choose a new password
    </a>
  </p>
  <p>This link expires in 30 minutes and can only be used once.</p>
  <p>If you didn't ask to reset your password, you can safely ignore this email.</p>
  <p style="color:#666;font-size:13px">Button not working? Paste this link into your browser:<br>
    https://app.yourco.com/reset-password/TOKEN</p>
</div>

الخطوة 5: تعامَل مع الرابط بحذر

حين يفتح المستخدم الرابط:

  • ابحث عن تجزئة الرمز، وتحقّق من أنه لم تنتهِ صلاحيته، ثم اعرض نموذج “كلمة المرور الجديدة”. لا تسجّل دخول المستخدم بعد.
  • أبعِد الرمز عن طلبات الجهات الخارجية. أضف <meta name="referrer" content="no-referrer"> إلى صفحة إعادة التعيين، ولا تحمّل فيها نصوص التحليلات أو الإعلانات، كي لا يتسرّب الرمز الموجود في عنوان URL عبر ترويسات المُحيل (referrer).
  • عند الإرسال، تحقّق من مطابقة كلمة المرور الجديدة لقواعد كلمات المرور لديك، وجزّئها بخوارزمية بطيئة (bcrypt أو scrypt أو Argon2)، واحذف الرمز، وسجّل الخروج من كل الجلسات الأخرى.

الخطوة 6: أكّد التغيير

أرسل دائمًا رسالة تأكيد قصيرة بعد تغيير كلمة المرور:

تم تغيير كلمة مرورك في YourApp يوم 28 أكتوبر الساعة 14:32 UTC. إن كنت أنت من غيّرها، فلا حاجة لأي إجراء آخر. وإن لم تكن أنت، فأمّن حسابك فورًا.

هذه الرسالة هي جرس الإنذار لدى المستخدم إن دخل شخص آخر إلى حسابه، فلا تتخطّها أبدًا.

تأكّد من وصولها

رسالة إعادة التعيين في مجلد البريد المزعج تعني تذكرة دعم. قبل الإطلاق:

  • اضبط SPF وDKIM وDMARC لنطاق الإرسال لديك،
  • واختبر بعناوين Gmail وOutlook وتحقّق من أن الترويسات تُظهر PASS،
  • وراقب معدّل Failed Deliveries (عمليات التسليم الفاشلة) في لوحة تحكم Inbixio بعد النشر.

قائمة التحقق

  • الاستجابة نفسها للعناوين الموجودة وغير المعروفة
  • رمز عشوائي من 32 بايت، ولا تُخزَّن إلا تجزئته
  • صلاحية من 15 إلى 60 دقيقة، واستخدام لمرة واحدة، ورمز نشط واحد لكل مستخدم
  • إرسال فوري من مُرسِل مخصّص وموثَّق
  • قالب واضح: زر واحد، ورابط نصي، ومدة الصلاحية، وسطر “لم تكن أنت؟”
  • لا نصوص برمجية لجهات خارجية في صفحة إعادة التعيين؛ والمُحيل مُعطَّل
  • تسجيل الخروج من الجلسات الأخرى وإرسال رسالة تأكيد بعد التغيير

أرسلها عبر Inbixio

اربط خادم SMTP الخاص بك، وأنشئ مفتاح API بصلاحيات محدّدة، وأرسل من أي لغة برمجة بطلب HTTPS واحد.

إنشاء حساب عرض الأسعار