۴ دانشجوی سون‌لرن
نحوه احراز هویت بصورت رمز یکبار مصرف
جامعه پایتون (وب) ایجاد شده در ۱۱ شهریور ۱۴۰۲

سلام

برای احراز هویت بصورت یکبار مصرف چطور می‌شود عمل کرد؟

سلام سالار جان

منظورتون از یکبار مصرف چی هست؟

پوریا شفیعی ۱۱ شهریور ۱۴۰۲، ۱۸:۵۳

منظورم OTP هست. شبیه سایت دیجیکالا که رمز یکبار مصرف به شماره تلفن کاربر ارسال میکنه. ایا میشه با jwt اونرو پیاده سازی کرد؟

salar keshavarzi ۱۲ شهریور ۱۴۰۲، ۰۴:۱۲

درود وقت بخیر

برای پیاده سازی سرویس OTP بسته به معماری پروژه ، روش‌های مختلفی وجود داره .

برای مثال ، شما میتونین یک کد رو به مدت ۱ دقیقه جنریت کنید ( یعنی باید تسکی نوشته بشود با سلری بعد یک دقیقه اون رو پاک کنه)

و اگر کاربر کد رو درست وارد کرد ، شما توکن‌های refresh یا access رو براش ارسال میکنید .

1. ابتدا پکیج مورد نیاز را نصب کنید:

pip install djangorestframework djangorestframework-simplejwt django-otp

2. تنظیمات را در فایل setting جنگو اعمال کنید

```python
# settings.py
INSTALLED_APPS = [
  # ...
  'rest_framework',
  'django_otp',
  'django_otp.plugins.otp_totp',
  'django_otp.plugins.otp_hotp',
  # ...
]
REST_FRAMEWORK = {
  'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework_simplejwt.authentication.JWTAuthentication',
  ),
}
# Configure OTP settings as needed
OTP_TOTP_ISSUER = 'YourAppName'
OTP_TOTP_KEY_LENGTH = 16
# ...
# Configure Simple JWT settings
SIMPLE_JWT = {
  'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60),
  'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1),
  'SLIDING_TOKEN_LIFETIME': timedelta(days=7),
  'SLIDING_TOKEN_REFRESH_MAX_LIFETIME': timedelta(days=30),
}
  1. یک مدل Django برای پروفایل کاربری‌ها ایجاد کنید که شامل فیلدهای مربوط به OTP مانند شماره تلفن یا آدرس ایمیل باشد.
  2. منطق تولید و ارسال OTP را هنگام درخواست تأیید هویت کاربر پیاده‌سازی کنید. این می‌تواند در یک ویو یا سریالایزر Django انجام شود. در زیر مثال ساده‌ای با استفاده از django_otp نمایش داده شده است:
# views.py
from django_otp.plugins.otp_totp.models import TOTPDevice
from rest_framework.views import APIView
from rest_framework.response import Response
class SendOTPView(APIView):
  def post(self, request):
    user = request.user # Get the authenticated user
    totp_device, created = TOTPDevice.objects.get_or_create(user=user, confirmed=True)
    if created:
      totp_device.save()
    totp_device.throttle_factor = 1 # Set throttle factor as needed
    totp_device.generate_challenge()
    totp_device.save()
    totp_device.send_token() # Send OTP via email/SMS
    return Response({"message": "OTP sent successfully"})
```


احراز هویت JWT را با تأیید OTP پیاده‌سازی کنید. در ادامه، یک نمونه آمده است:

```python
# views.py
from rest_framework_simplejwt.views import TokenObtainPairView
from django_otp.plugins.otp_totp.models import TOTPDevice
from rest_framework import status
from rest_framework.response import Response
class OTPTokenObtainPairView(TokenObtainPairView):
  def post(self, request, *args, **kwargs):
    # Get the OTP entered by the user
    otp = request.data.get("otp")
    # Verify OTP
    user = request.user # Get the authenticated user
    totp_device = TOTPDevice.objects.filter(user=user, confirmed=True).first()
    if not totp_device:
      return Response({"detail": "OTP device not found"}, status=status.HTTP_400_BAD_REQUEST)
    if not totp_device.verify_token(otp):
      return Response({"detail": "Invalid OTP"}, status=status.HTTP_400_BAD_REQUEST)
    # Generate JWT token
    return super().post(request, *args, **kwargs)
```
  1. URL‌های خود را برای شامل کردن ویوها و JWT تنظیم کنید و از آنها برای محافظت از نقاط پایانی مورد نیاز با احراز هویت استفاده کنید.
  2. جریان احراز هویت خود را با ارسال درخواست‌هایی جهت دریافت توکن JWT پس از تأیید OTP آزمایش کنید.

موفق باشید ?

بهترین پاسخ
Reza Mobaraki ۱۳ شهریور ۱۴۰۲، ۱۱:۵۵

خیلی ممنون ، بسیار مفید بود

salar keshavarzi ۱۴ شهریور ۱۴۰۲، ۱۳:۵۳