تا ۶۰ درصد تخفیف شگفت انگیز نوروزی! (‌ آخرین فرصت )

اطلاعات بیشتر..
ثانیه
دقیقه
ساعت
روز
مهدی
5 روز پیش توسط مهدی مطرح شد
2 پاسخ

ارسال کردن مجدد توکن

سلام وقت همگی بخیر ...
من یه پروژه ریکت نیتیو و بک اند نود جی اس دارم
یه کد register دارم که به واسطه کد وریفای که به ایمیل کاربر فرستاده میشه اکانت فعال میشه
الان همه چیز واسم به درستی کار میکنه ایمیل ارسال میشه
فقط موضوعی که هست اگه کاربر بخواد مجدد کد رو ارسال کنه باید چه کاری انجام بدم
وقتی یه مرتبه رجیستر رو انجام داد اطلاعاتش تو دیتابیس ذخیره میشه و اگه بخواد از اول رجیستر کنه بهش اجازه داده نمیشه چون ایمیل ثبت شده دوباره نمیتونه ثبت شه
و یه موضوع دیگه اگه بخوام زمانی که کاربر ریجستر رو انجام میده دیتایی ذخیره نشه تا وقتی که ایمیلشو تایید کنه راهی براش وجود داره؟؟


ثبت پرسش جدید
آرش یدی
تخصص : امنیت بک اند
@dark25eye 5 روز پیش مطرح شد
0

سلام وقتت بخیر باشه
خب، دو تا مشکل رو مطرح کردی، بیا دونه‌دونه بررسی کنیم:

۱. ارسال مجدد کد وریفای
چون ایمیل کاربر ثبت شده و نمی‌تونه دوباره رجیستر کنه، باید یه API جدا برای ارسال مجدد کد وریفای داشته باشی. روال کار می‌تونه این باشه:

۱. یه route جدید مثل /resend-verification درست کن. 2. توی این route، ایمیل کاربر رو بگیر. 3. چک کن که آیا این ایمیل تو دیتابیس وجود داره و هنوز وریفای نشده؟ 4. اگه تایید نشده بود، یه کد جدید جنریت کن، تو دیتابیس آپدیت کن و دوباره به ایمیلش بفرست. 5. می‌تونی یه محدودیت زمانی هم بذاری که مثلا هر ۵ دقیقه فقط یک بار بتونه کد جدید بگیره.

نمونه پیاده‌سازی با Express.js:

app.post('/resend-verification', async (req, res) => {
    const { email } = req.body;
    const user = await User.findOne({ email });

    if (!user) {
        return res.status(404).json({ message: "کاربر یافت نشد" });
    }

    if (user.verified) {
        return res.status(400).json({ message: "اکانت قبلاً تأیید شده است" });
    }

    // تولید کد جدید و ذخیره در دیتابیس
    const newCode = Math.floor(100000 + Math.random() * 900000); // تولید یه کد ۶ رقمی
    user.verificationCode = newCode;
    await user.save();

    // ارسال ایمیل (فرض کن sendEmail یه فانکشن برای ارسال ایمیله)
    await sendEmail(user.email, "کد تأیید جدید شما", `کد جدید: ${newCode}`);

    return res.json({ message: "کد جدید ارسال شد" });
});

۲. جلوگیری از ذخیره کاربر قبل از تأیید ایمیل
اگه می‌خوای تا وقتی که ایمیل تأیید نشده اطلاعات توی دیتابیس ذخیره نشن، راه حل ساده اینه که:

ثبت اطلاعات رو تو یه مدل جداگانه (مثلا TemporaryUsers) ذخیره کن.

وقتی کاربر ایمیلش رو تایید کرد، اطلاعاتش رو به جدول اصلی کاربران منتقل کن.

بعد از تایید، رکورد رو از TemporaryUsers پاک کن.

نمونه مدل موقت:

const mongoose = require('mongoose');

const TemporaryUserSchema = new mongoose.Schema({
    email: String,
    password: String,
    verificationCode: String,
    createdAt: { type: Date, default: Date.now, expires: 86400 } // حذف بعد از 24 ساعت
});

module.exports = mongoose.model('TemporaryUser', TemporaryUserSchema);

این مدل، اگه بعد از ۲۴ ساعت تایید نشه، خودکار حذف میشه چون expires: 86400 گذاشتیم.

وقتی کد تایید رو وارد کرد، اطلاعات رو به مدل User منتقل کن و از TemporaryUser حذفش کن.

app.post('/verify', async (req, res) => {
    const { email, code } = req.body;
    const tempUser = await TemporaryUser.findOne({ email, verificationCode: code });

    if (!tempUser) {
        return res.status(400).json({ message: "کد اشتباه است" });
    }

    // انتقال به جدول کاربران اصلی
    const newUser = new User({
        email: tempUser.email,
        password: tempUser.password, // هش شده از قبل
        verified: true
    });

    await newUser.save();
    await TemporaryUser.deleteOne({ email });

    return res.json({ message: "اکانت تأیید شد!" });
});

با این روش، کاربری که ثبت‌نام کرده ولی ایمیلش رو تأیید نکرده، تو دیتابیس اصلی ذخیره نمیشه تا وقتی که کد تأیید رو بزنه.


مهدی
@saras998 3 روز پیش مطرح شد
0

یه دنیا ممنونم ازت دوست عزیز مشکلم حل شد


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام