برنامه نویسی

رویکرد اول موبایل برای احراز هویت الگوی کامل FastAPI: مهاجرت به Phone_number/OTP

همانطور که ممکن است بدانید ، فریپی یکی از تحسین برانگیزترین چارچوب ها برای توسعه API های استراحت است. یکی دیگر از پروژه های فوق العاده توسط همان نویسنده ، Tiangolo ، الگوی کامل Stack Fastapi است که من قبلاً در اینجا درباره آن نوشتم.

در این پست ، من شما را از طریق فرآیند جایگزینی جریان تأیید اعتبار ایمیل/رمز عبور در الگوی با یک سیستم مبتنی بر Phone_number/OTP راهنمایی می کنم. این رویکرد برای برنامه های اول موبایل ایده آل است و روشی ایمن و کاربر پسند برای تأیید اعتبار کاربران ارائه می دهد. هدف من این است که ضمن حفظ پایبندی خود به پروژه اصلی ، حداقل در پروژه اصلی ایجاد کنم Oauth2 وت استانداردهای JWTبشر بیایید شیرجه بزنیم! 😉


1. جایگزین کنید email وت password با phone_number وت otp

پیکربندی به روزرسانی

پرونده: ./.env
تغییر مورد نیاز:

  • به روزرسانی FIRST_SUPERUSER ارزش یک شماره تلفن ، به عنوان مثال +17375550100 یا +989130000000بشر
  • برداشتن FIRST_SUPERUSER_PASSWORD زیرا دیگر لازم نیست.

مدل ها را به روز کنید

پرونده: ./backend/app/models.py
تغییرات مورد نیاز:

تمام موارد موجود در email میدان با phone_numberبشر

مثال:

email: EmailStr = Field(unique=True, index=True, max_length=255)
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

تغییر به:

phone_number: str = Field(unique=True, index=True, max_length=20)
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مهم: این تغییر نیاز به به روزرسانی طرحواره پایگاه داده با استفاده از مهاجرت های Alembic دارد.


مسیرهای API را به روز کنید

مسیرهای خصوصی

پرونده: ./backend/app/api/routes/private.py
همه وقایع را جایگزین کنید email وت password با phone_number وت otpبشر

مسیر ورود به سیستم

پرونده: ./backend/app/api/routes/login.py

به روزرسانی authenticate تماس:

user = crud.authenticate(session=session, email=form_data.username, password=form_data.password)
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

تغییر به:

user = crud.authenticate(session=session, phone_number=form_data.username, otp=form_data.password)
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

توجه: نگه داشتن form_data.username وت form_data.password بدون تغییر به دلیل استانداردهای OAUTH2.


کاربر را به روز کنید

پرونده: ./backend/app/api/routes/users.py

  • تعویض کردن email با phone_numberبشر
  • حذف if statement در create_user عملکرد مربوط به اعتبار سنجی ایمیل.

برنامه های کاربردی پایگاه داده

پرونده: ./backend/app/core/db.py

  • تعویض کردن email منابع با phone_numberبشر
  • برداشتن FIRST_SUPERUSER_PASSWORD زیرا دیگر لازم نیست.

عملیات خزنده

پرونده: ./backend/app/crud.py

  • جایگزین همه email وت password منابع با phone_number وت otpبشر
  • نام بردن get_user_by_email به get_user_by_phone_number و همه منابع را به این عملکرد به روز کنید.

2. برای درخواست OTP یک نقطه پایانی API اضافه کنید

پرونده: ./backend/app/api/routes/login.py

نقطه پایانی زیر را اضافه کنید:

OTP_EXPIRE_MINUTES = 5

@router.post("/login/request-otp")
def request_otp(session: SessionDep, phone_number: str) -> Message:
    """
    Generate and send OTP to the provided phone number.
    """
    user = crud.get_user_by_phone_number(session=session, phone_number=phone_number)
    if not user:
        user = crud.create_user(session=session, user_create=UserCreate(phone_number=phone_number))

    otp = generate_otp()
    otp_expires_at = datetime.now(timezone.utc) + timedelta(minutes=OTP_EXPIRE_MINUTES)

    crud.update_user(
        session=session,
        db_user=user,
        user_in=UserUpdate(otp=otp, otp_expires_at=otp_expires_at),
    )

    send_otp(phone_number, otp)

    return Message(message="OTP sent successfully.")
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


3. OTP پس از ورود به سیستم را باطل کنید

پرونده: ./backend/app/api/routes/login.py
در login_access_token عملکرد ، OTP را پس از ورود موفقیت آمیز باطل کنید:

crud.update_user(
    session=session,
    db_user=user,
    user_in=UserUpdate(otp=None, otp_expires_at=None)
)
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


4. عملکردهای غیر ضروری را حذف کنید

پرونده: ./backend/app/api/routes/login.py

عملکردهای زیر را حذف کنید:

  • recover_password
  • reset_password
  • recover_password_html_content

5. ویژگی های ایمیل غیر ضروری را حذف کنید

پرونده: ./backend/app/api/routes/users.py

منطق مرتبط با ایمیل را حذف کنید ، مانند:

if settings.emails_enabled and user_in.email: ...
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


6. به روزرسانی رمز عبور و توابع ثبت نام کاربر را حذف کنید

پرونده: ./backend/app/api/routes/users.py

عملکردهای زیر را حذف کنید:

  • update_password_me
  • register_user

از آنجا که اکنون ما از تأیید هویت مبتنی بر OTP استفاده می کنیم ، این توابع زائد هستند.


7. مدل ها را ساده کنید

پرونده: ./backend/app/models.py

تعویض کردن password با otp:

همه را به روز کنید password زمینه به otpبشر

مثال:

password: str | None = Field(default=None, min_length=8, max_length=40)
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

تغییر به:

otp: str | None = Field(default=None, max_length=6)
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


OTP را از UserCreate:

برای UserCreate مدل ، نیازی به شامل موارد نیست otp میدان آن را به شرح زیر به روز کنید:

class UserCreate(UserBase):
    pass
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

این روند ایجاد را ساده می کند زیرا OTP بعداً در حین ورود به سیستم تولید می شود.


قسمتهای انقضا OTP را اضافه کنید:

اضافه کردن otp_expires_at زمینه به هر دو UserUpdate وت User مدل ها.

مثال:

otp_expires_at: datetime | None = Field(default=None, nullable=True)
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


مدل های غیر ضروری را حذف کنید:

مدل هایی را که دیگر مورد نیاز نیستند حذف کنید ، از جمله:

  • UserRegister
  • UpdatePassword
  • NewPassword

این پاکسازی تضمین می کند که مدل ها با سیستم احراز هویت جدید مرتبط هستند.


8. برنامه های کاربردی را به روز کنید

پرونده: ./backend/app/utils.py

عملکردهای بلااستفاده را حذف کنید:

  • generate_reset_password_email
  • generate_new_account_email
  • generate_password_reset_token
  • verify_password_reset_token

اضافه کردن نسل OTP:

def generate_otp():
    return str(random.randint(100000, 999999))  # 6-digit OTP
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

ارسال پیام کوتاه را اضافه کنید:

def send_otp(phone_number: str, otp: str):
    """
    Sends an OTP to the provided phone number.
    """
    # Implement this function according to your SMS provider

    pass
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


به دنبال این مراحل ، جریان ایمیل/رمز عبور الگوی کامل STACK FASTAPI به یک سیستم مبتنی بر PHONE_NUMBER/OTP تبدیل می شود ، در حالی که آن را با بهترین شیوه ها و استانداردها هماهنگ می کند. برنامه نویسی مبارک! 🚀


این تغییرات در پروژه اصلی در GitHub من موجود است. استفاده از این پروژه با احتیاط بسیار مهم است ، زیرا من هنوز وقت نوشتن تست ها را نداشته ام.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا