سؤال

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

أود استخدام نفس قالب البريد الإلكتروني لكلا الحالتين، على الرغم من أن البريد الإلكتروني "المستخدم الجديد" سيأتي من وحدة تحكم للمستخدمين وسوف يأتي البريد الإلكتروني "نسيت كلمة المرور" من وحدة تحكم كلمات مرور.

البريد الإلكتروني يبدو شيئا مثل هذا:

<%=h @user.name %>, 
Your membership details:
Username: <%=h @user.login %>
Password: <%=h @user.password %>

عندما يقوم المستخدم بتسجيل الدخول، يعمل هذا على ما يرام، مما تسبب في رسالة بريد إلكتروني تبدو مثل:

  Bryan,
  Your membership details:
  Username: bryan
  Password: password

لسوء الحظ، يفتح كل شيء عند محاولة استخدام هذا القالب لإرسال بريد إلكتروني "نسيت كلمة المرور" من وحدة تحكم كلمات المرور. الشيء الذي يحيرني، على الرغم من أنه هو نوع من فترات الراحة فقط:

  Bryan,
  Your membership details:
  Username: bryan
  Password: 

بمعنى آخر، @ user.name غير صالح، كما هو @ user.login. ولكن لسبب ما في هذه الحالة @ user.password لا يأتي من خلال.

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

هل كانت مفيدة؟

المحلول

من الصعب القول دون رؤية بعض التعليمات البرمجية الخاصة بك، وتحديدا أساليب وحدة التحكم.

من الممكن أن يكون البريد الإلكتروني للتسجيل يستخدم كلمة المرور قبل مشفرة. لا تتوفر كلمة المرور غير المشفرة عموما الإجراءات اللاحقة، لأنها مخزنة مشفرة في DB.

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

على أي حال، هذا يتعلق بكثير من التكهنات التي يمكن للمرء القيام بها دون رؤية التعليمات البرمجية.

نصائح أخرى

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

لا أعتقد أن هذه هي الطريقة "الأفضل" للقيام بالأشياء على أي حال، أرسل لهم رابطا حيث يمكنهم إعادة تعيين كلمة المرور الخاصة بهم بدلا من كلمة مرورهم الأصلية فقط لأنهم قد نسوا ذلك مرة واحدة، ما الذي يمنعها من نسيانها مرة أخرى؟

إذا نظرت إلى قاعدة البيانات، سترى كلمة مرور تجزئة وجزهة بالملح.

سيتعين عليك تخزين كلمة مرور النص Plantext في متغير آخر قبل تخزينها في قاعدة البيانات، باستخدام المتغير المنفصل مع كلمة مرور النص Plantext يمكنك تمرير ذلك إلى ActiveMailer وإرساله دون التشفير في البريد الإلكتروني.

@user = User.find(params[:id])
password = params[:user][:password]
options = {
    :password => password,
    :user => @user
}

if @user.update_attributes(params[:user]) and Mailer.deliver_reset(options)
    flash[:notice] = "Check your email (#{@user.email}) for your new password."
    redirect_to_back_or_default('/')
else
    flash[:error] = "Look at the errors below"
end

لا تفعل هذا

يستخدم العديد من المستخدمين نفس كلمات المرور في أماكن متعددة (نعم، لا ينبغي أن يفعل ذلك). تخزين كلمات المرور الخاصة بهم في مخاطر النص العادي ليس فقط أمان موقعك، ولكن أيضا أمان المستخدمين على مواقع أخرى. ولا تبدأ بي بإرسال كلمات مرور نصية واضحة عبر البريد الإلكتروني.

تفعل ذلك كما اقترح الآخر هنا، لديك نظام إعادة تعيين كلمة المرور، وليس نظام "هنا كلمة المرور".

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

مؤشر المصادقة المريحة كلمة المرور مؤقتا فقط - طويل فقط بما يكفي لتشفيره وحفظ الإصدار المشفر. هذا لأمان كما ذكر آخرون.

نظرا لأنك لست قلقا جدا بشأن الأمان لهذا التطبيق، أوصي بتوليد رمز فريد لكل مستخدم وتزويدها بعنوان URL لاستخدامه لتسجيل الدخول. التوصية بعنوان URL لأن كلمة المرور "التي تم إنشاؤها) قد تعطي المستخدم الذي يمكن أن يغيره. يمكنك إرسال بريد إلكتروني إلى المستخدمين لديك شيء مثل:

 Bryan,
  Your membership details:
  Username: bryan
  Your url: http://domain.com/x7sjs0qn

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top