رویکرد اول موبایل برای احراز هویت الگوی کامل 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 من موجود است. استفاده از این پروژه با احتیاط بسیار مهم است ، زیرا من هنوز وقت نوشتن تست ها را نداشته ام.