از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
روش ایجاد یک توکن وب JSON در چارچوب REST Django

سرفصلهای مطلب
هنگامی که در حال ساختن API هستید ، امنیت باید در صدر لیست شما باشد. شما می خواهید اطمینان حاصل کنید که فقط افراد مناسب می توانند به موارد مناسب دسترسی پیدا کنند – و اینجاست که احراز هویت وارد می شود.
یکی از متداول ترین و قابل اعتماد ترین روش ها برای مدیریت تأیید اعتبار در برنامه های وب مدرن استفاده از JWT ، کوتاه برای نشانه های وب JSON است.
اگر در حال کار با چارچوب Django Rest (DRF) هستید ، ممکن است از قبل بدانید که این ابزار با ابزارهای مفید زیادی برای ساخت API همراه است.
اما وقتی صحبت از احراز هویت مبتنی بر توکن می شود ، باید کمی کمک اضافی به همراه داشته باشید. JWT به طور پیش فرض در DRF ساخته نشده است ، اما تنظیم آن بسیار آسان است که مراحل را بدانید.
در این آموزش ، من دقیقاً روش ایجاد و استفاده از JWT ها را در چارچوب REST Django قدم به قدم طی می کنم.
فهرست مطالب:
-
JWT چیست؟
-
چرا از JWT در چارچوب REST Django استفاده می کنید؟
-
روش راه اندازی JWT در چارچوب استراحت Django
-
روش استفاده از این نشانه ها
-
متداول
-
بهترین روشها
-
افکار نهایی
JWT چیست؟
JWT (JSON Web Token) روشی جمع و جور و دارای خود برای ارسال ایمن اطلاعات بین دو طرف است. این اغلب برای تأیید اعتبار استفاده می شود.
وقتی کسی وارد سیستم می شود ، نشانه ای دریافت می کند. این نشانه در جبهه ذخیره می شود (مانند LocalStorage) ، و هر بار که کاربر درخواست می کند ، به همراه آن ارسال می شود.
سرور آن نشانه را بررسی می کند ، و اگر همه چیز خوب است ، به داده های درخواستی دسترسی پیدا می کند. نیازی به کوکی یا جلسات نیست.
JWT از سه قسمت ساخته شده است:
-
هدر – حاوی نوع توکن و الگوریتم امضا است.
-
بار – شامل داده ها (مانند شناسه کاربر).
-
امضاء – برای تأیید نشانه تغییر نکرد.
چرا از JWT در چارچوب REST Django استفاده می کنید؟
در اینجا به همین دلیل JWT یک انتخاب محکم برای برنامه های DRF است:
-
بی رویه: هیچ جلسی لازم نیست روی سرور
-
مقیاس پذیر: از آنجا که بدون تابعیت است ، با برنامه های بزرگتر و میکروسرویس ها به خوبی کار می کند.
-
به طور گسترده استفاده می شود: JWT یک استاندارد مشترک است. بسیاری از چارچوب های جلوی (مانند React ، Vue و SO روی) از قبل می دانید که چگونه با آن کار کنید.
روش راه اندازی JWT در چارچوب استراحت Django
بیایید وارد آن شویم. در اینجا روش تنظیم احراز هویت JWT در DRF آورده شده است.
مرحله 1: بسته های مورد نیاز را نصب کنید
برای رسیدگی به JWT به یک کتابخانه نیاز دارید. محبوب ترین مورد DjangorestFrameWork-SimpleJwt است.
این را در خود اجرا کنید terminal:
pip install djangorestframework-simplejwt
این همه چیزهایی را که برای تولید ، تازه کردن و تأیید نشانه های وب JSON در پروژه DRF خود نیاز دارید ، نصب می کند.
مرحله 2: تنظیمات Django خود را به روز کنید
به سمت خود بروید settings.py
و به روزرسانی REST_FRAMEWORK
بخشی مانند این:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
)
}
این به DRF می گوید که به دنبال JWT در درخواست باشد Authorization
هدر و از آن برای تأیید اعتبار کاربر استفاده کنید. این جایگزین احراز هویت مبتنی بر جلسه ، که برای برنامه های وب معمولی است ، با احراز هویت مبتنی بر توکن ، ایده آل برای API است.
مرحله 3: URL های توکن را به خود اضافه کنید urls.py
JWT با صدور یک جفت نشانه کار می کند: A access
توکن (کوتاه مدت) و الف refresh
نشانه (طولانی مدت). این نشانه ها از طریق دو دیدگاه اصلی اداره می شوند.
در شما urls.py
(معمولاً در root پروژه یا api
برنامه):
from django.urls import path
from rest_framework_simplejwt.views import (
TokenObtainPairView,
TokenRefreshView,
)
urlpatterns = [
path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]
در این کد:
-
/api/token/
: مشتری (مانند برنامه های Frontend یا برنامه های تلفن همراه) اعتبار کاربر را به این نقطه پایانی ارسال کنید تا دسترسی و تازه کردن نشانه ها را دریافت کنید. -
/api/token/refresh/
: هنگامی که نشانه دسترسی منقضی می شود ، مشتری برای دریافت یک نشانه دسترسی جدید ، توکن تازه سازی را به اینجا می فرستد.
مرحله 4: آن را آزمایش کنید
بیایید بگوییم شما یک کاربر با نام کاربری و رمز عبور دارید.
شما می توانید یک درخواست پست برای /api/token/
:
{
"username": "your_username",
"password": "your_password"
}
اگر اعتبار صحیح باشد ، چیزی مانند:
{
"refresh": "long_refresh_token",
"access": "short_lived_access_token"
}
شما از access
نشانه ای برای ایجاد درخواست های معتبر. وقتی منقضی شد ، ارسال کنید refresh
به /api/token/refresh/
برای گرفتن یک مورد جدید
روش استفاده از این نشانه ها
شامل نشانه دسترسی در Authorization
هدر درخواست های API شما مانند این:
Authorization: Bearer your_access_token_here
هنگامی که نشانه دسترسی منقضی می شود ، نشانه تازه را به آن ارسال کنید /api/token/refresh/
مثل این:
{
"refresh": "your_refresh_token_here"
}
و یک نشانه دسترسی جدید دریافت خواهید کرد.
ایمن کردن نماهای API خود
برای اطمینان از اینکه فقط کاربران معتبر می توانند به نقاط پایانی خاصی دسترسی پیدا کنند ، اضافه کنید IsAuthenticated
کلاس اجازه به نظرات شما.
در اینجا یک مثال آورده شده است:
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
from rest_framework.response import Response
class SecureView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request):
return Response({"message": "You are authenticated!"})
این دیدگاه فقط در صورت درخواست درخواست JWT معتبر ، پاسخی را برمی گرداند. اگر هیچ نشانه ای وجود نداشته باشد یا نامعتبر باشد/منقضی شده باشد ، کاربر خطای 401 غیر مجاز دارد.
خلاصه
این همان کاری است که ما فقط انجام دادیم:
-
نصب و پیکربندی شده
simplejwt
برای DRF -
تنظیمات نسل و نقاط پایانی را تنظیم کنید.
-
نماهای محافظت شده با احراز هویت مبتنی بر توکن.
-
روش ایجاد و تازه کردن درخواست های مبتنی بر توکن را توضیح داد.
JWT روشی قدرتمند و مقیاس پذیر برای تأمین API های Django شماست. این برای برنامه های مدرن وب و تلفن همراه مناسب است.
آیا می خواهید یک مرحله جایزه برای سفارشی کردن بارهای توکن (به عنوان مثال ، اضافه کردن نقش کاربر یا ایمیل به JWT)؟ به من اطلاع دهید!
متداول
توکن چه مدت طول می کشد؟
به طور پیش فرض ، نشانه دسترسی 5 دقیقه طول می کشد و نشانه تازه سازی 1 روز طول می کشد. می توانید این را در تنظیمات خود سفارشی کنید:
from datetime import timedelta
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=15),
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
}
این به معنای این است:
-
این تا چه مدت شما را تعیین می کند نشانه های JWT آخر:
-
ACCESS_TOKEN_LIFETIME
: چه مدت نشانه دسترسی معتبر است (به عنوان مثال ، 15 دقیقه). -
REFRESH_TOKEN_LIFETIME
: چه مدت توکن تازه سازی معتبر است (به عنوان مثال ، 1 روز).
-
چرا مهم است:
-
در دسترسی به نشانه همان چیزی است که به کاربر اجازه می دهد تا با نقاط پایانی محافظت شده تعامل داشته باشد.
-
در نشانه برای بدست آوردن یک نشانه دسترسی جدید بدون ورود دوباره به سیستم استفاده می شود
کجا باید توکن را ذخیره کنم روی جلو؟
در حالت ایده آل در localStorage
یا sessionStorage
بشر فقط از خطرات XSS آگاه باشید. داده های حساس را در خود نشانه ذخیره نکنید.
می توانید نشانه های دسترسی/Refresh JWT را ذخیره کنید روی جبهه در:
-
localStorage
: داده ها حتی پس از بسته شدن برگه/مرورگر ادامه می یابد. -
sessionStorage
: داده ها هنگام بسته شدن برگه/مرورگر از بین می روند. -
داده های حساس کاربر را در نشانه یا ذخیره سازی ذخیره نکنید.
-
نشانه های ذخیره شده در
localStorage
می تواند در برابر حملات XSS آسیب پذیر باشد. -
در صورت امکان ، برای امنیت بهتر استفاده از کوکی های httponly را در نظر بگیرید (هرچند که پیچیده تر برای راه اندازی است).
آیا می توانم زمینه های سفارشی را به نشانه اضافه کنم؟
بله می توانید نادیده بگیرید TokenObtainPairSerializer
برای شامل داده های سفارشی در بار ، مانند این:
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
@classmethod
def get_token(cls, user):
token = super().get_token(user)
token['username'] = user.username
return token
سپس آن را در خود سیم بزنید urls.py
بشر
-
شما در حال سفارشی کردن بار JWT برای شامل اطلاعات بیشتر کاربر هستید (مانند
username
). -
این بدان معنی است که وقتی کاربر وارد سیستم می شود ، JWT اکنون حمل می کند
username
در داخل بار. -
اگر جلوی شما بخواهد نام کاربر را بدون برقراری تماس API دیگر نمایش دهد ، مفید است.
خلاصه:
قسمت | هدف |
SIMPLE_JWT تنظیمات |
انقضا را کنترل می کند |
localStorage/sessionStorage |
از کجا می توان نشانه ها را ذخیره کرد روی جبهه |
سریال کننده توکن سفارشی | اطلاعات اضافی کاربر را به توکن اضافه کنید (به عنوان مثال ، نام کاربری) |
urls.py پیکربندی |
نمای توکن سفارشی خود را به نقطه پایانی ورود به سیستم متصل می کند |
بهترین روشها
حال بیایید به بهترین روشهای DRF نگاه کنیم تا بتوانید به طور موثری از این چارچوب استفاده کنید:
1 همیشه از https استفاده کنید
HTTPS داده های منتقل شده بین مشتری (مرورگر یا برنامه) و سرور را رمزگذاری می کند. اگر به جای آن از http استفاده کنید ، هر کسی روی همان شبکه (مانند Wi-Fi عمومی) می تواند از طریق روشی به نام حملات Man-in-the-Mdle (MITM) داده های حساس-از جمله نشانه های دسترسی-را رهگیری کند.
بهترین روشها:
-
برای فعال کردن HTTPS برای همه نقاط پایانی از یک گواهی SSL استفاده کنید.
-
تمام درخواست های HTTP را به HTTPS تغییر دهید.
-
برای اجرای HTTPS از هدر HSTS (HTTP Security Transport Security) استفاده کنید روی طرف مشتری
2 داده های حساس را در نشانه ذخیره نکنید
نشانه ها مانند jwts غالباً در سمت مشتری ذخیره می شوند (در محلی ، SessionStorage یا کوکی ها).
اگر آنها حاوی داده های حساس باشند (مانند رمزهای عبور ، اطلاعات شخصی یا کلیدهای مخفی) ، آنها به یک خطر امنیتی بزرگ تبدیل می شوند – به خصوص اگر به سرقت رفته یا به خطر بیایند.
در عوض چه کاری باید انجام دهیم:
-
فقط حداقل اطلاعات مورد نیاز (مانند شناسه کاربر یا نقش) را ذخیره کنید.
-
از نشانه های مات (رشته های تصادفی) استفاده کنید که در صورت امکان داده های تعبیه شده را حمل نمی کنند.
-
داده های حساس را ایمن ذخیره کنید روی سرور ، نه در نشانه.
3 کلید امضای خود را مخفی نگه دارید
کلید امضای چیست؟
در سیستم هایی که از JWTS استفاده می کنند ، از کلید امضای (یا کلید مخفی) برای امضای نشانه استفاده می شود – یک روش رمزنگاری برای اطمینان از این که این نشانه دستکاری نشده است.
اگر کسی کلید امضای شما را دریافت کند ، می تواند نشانه های معتبر به نظر برسد و کاربران را جعل کند.
بهترین روشها:
-
کلید خود را در محیط های امن (مانند متغیرهای محیط ، مدیران مخفی) ذخیره کنید.
-
هرگز کلید کنترل منبع را مرتکب نکنید.
-
از اسرار قوی و به طور تصادفی تولید شده استفاده کنید.
-
برای مقیاس پذیری و امنیت بهتر (به عنوان مثال ، با الگوریتم Rs256) استفاده از کلیدهای نامتقارن (جفت های کلید عمومی/خصوصی) را در نظر بگیرید.
4 در صورت لزوم نشانه ها را بچرخانید
چرخش نشانه چیست؟
چرخش توکن به process از تولید دوره های جدید و بی اعتبار کردن موارد قدیمی.
این مهم است زیرا اگر یک نشانه به سرقت رفته یا درز شود ، چرخاندن آن به طور مرتب پنجره ای را که در آن مهاجم می تواند از آن استفاده کند ، محدود می کند. این امر به ویژه برای نشانه های تازه سازی ، که تمایل به زندگی طولانی تر دارند ، مهم است.
بهترین روشها:
-
از نشانه های دسترسی کوتاه مدت و نشانه های تازه سازی طولانی مدت استفاده کنید.
-
پس از استفاده از آنها ، نشانه های تازه سازی را باطل کنید (عملی به نام “چرخش توکن تازه”).
-
Track برای تشخیص استفاده مجدد یا سرقت ، TREAKESS TOKENS SORE SORE SORE را صادر کرد.
5 یک عمر کوتاه برای دسترسی به نشانه های دسترسی تنظیم کنید و از نشانه های تازه سازی عاقلانه استفاده کنید
دسترسی به نشانه ها اجازه دسترسی به منابع محافظت شده را اعطا می کند. در صورت سرقت ، می توان آنها را تا زمان انقضا توسط مهاجمان استفاده کرد.
بهترین روشها:
-
به سرعت منقضی شده تا به سرعت منقضی شوید (5-15 دقیقه رایج است).
-
از نشانه های Refresh استفاده کنید تا به مشتری اجازه دهید تا بدون ورود مجدد به نشانه های دسترسی جدید دریافت کند.
-
نشانه های تازه سازی را با اطمینان ذخیره کنید (کوکی های فقط HTTP را ترجیح دهید).
-
نشانه های تازه کردن روی ورود به سیستم ، فعالیت مشکوک یا تغییر دستگاه.
افکار نهایی
-
دسترسی به نشانه ها باید کوتاه مدت و محدود باشد.
-
نشانه های تازه باید طولانی مدت باشد اما چرخشی و با دقت ابطال شود.
-
همیشه اسرار را به طور ایمن ذخیره کنید ، از طریق HTTPS خدمت کنید و از اعتماد به مشتری با منطق یا داده های حساس خودداری کنید.
آیا دوست دارید نشان دهم که چگونه این همه در یک مثال به هم پیوند می خورد (مانند روش ورود به سیستم ، صدور توکن و تازه کردن)؟
JWT ها احراز هویت را برای API ها آسان تر و مقیاس پذیر تر می کنند. هنگامی که آن را در چارچوب Django REST تنظیم کردید ، فقط کار می کند – و شما یک راه مطمئن برای اجازه دادن به کاربران و نگه داشتن ترافیک ناخواسته دارید.
اگر در حال ساختن API با Django هستید ، این یک چیز ضروری است.
خواندن و منابع بیشتر
-
ساده jwt Documentation
-
اسناد رسمی DRF
-
JWT.IO – عالی برای اشکال زدایی و یادگیری روش کار JWT.
-
برگه تقلب OWASP روی jwt
منتشر شده در 1404-04-17 01:59:08