سلام به همه دوستای خوبم. امروز میخوام یه نگاه خلاصه به احراز هویت یا همون authentication در فریم ورک جنگو داشته باشم.
روش های مختلفی برای این کار وجود داره. یکی از بهترین و ساده ترین روش ها استفاده از jwt هست.
این کلمه مخفف JSON Web Tokens هست.
موارد زیر رو در فایل settings جنگو اضافه کنید
INSTALLED_APPS = [
...
'rest_framework_simplejwt',
'rest_framework_simplejwt.token_blacklist',
...
]
همچنین
'DEFAULT_AUTHENTICATION_CLASSES': (
... 'rest_framework_simplejwt.authentication.JWTAuthentication',
...
),
و در نهایت
SIMPLE_JWT = { 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5), 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), 'ROTATE_REFRESH_TOKENS': False, 'BLACKLIST_AFTER_ROTATION': True, 'UPDATE_LAST_LOGIN': False, 'ALGORITHM': 'HS256', 'SIGNING_KEY': SECRET_KEY, 'VERIFYING_KEY': None, 'AUDIENCE': None, 'ISSUER': None, 'AUTH_HEADER_TYPES': ('Bearer',), 'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION', 'USER_ID_FIELD': 'id', 'USER_ID_CLAIM': 'user_id', 'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',), 'TOKEN_TYPE_CLAIM': 'token_type', 'JTI_CLAIM': 'jti', 'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp', 'SLIDING_TOKEN_LIFETIME': timedelta(minutes=5), 'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1), }
و میدونیم که پکیج مربوطه رو باید نصب هم کنیم!
pip install djangorestframework-simplejwt
حالا چندتا url میخوایم
urlpatterns = [
...
path('api/login', ```
TokenObtainPairView.as_view()),
path('api/logout', logout_
view.LogoutView.as_view()),
path('api/refresh-token',
TokenRefreshView.as_view()),
...
]
حالا این که هر کدوم از این url ها چی کار میکنن رو میگم براتون...اولا که دو تا از viewها یعنی
TokenObtainPairView و TokenRefreshView به صورت آماده وجود دارن و باید اونها رو import کنیم
from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView
در بخش login یک api با متد post داریم که دو پارامتر username و password رو به فرمت str میگیره و دو تا توکن به ما برمیگردونه به نام های refresh-token و access-token. طبق تنظیماتی که در بالا مشاهده میکنیم، refresh-token هر ۲۴ ساعت و access-token هر ۵ دقیقه منقضی میشن. ما برای هر api که به login نیاز داشته باشه باید بهش access-token بدیم و برای تولید access-token هم به refresh-token نیاز داریم و این کار با روت api/refresh-token که متدش get هست انجام میگیره و به شما access-token جدید رو تحویل میده! به همین راحتی!
بعد از ۲۴ ساعت هم که refresh-token منقضی شد باید زحمت بکشید دوباره login کنید و وارد سایت بشید:)
اما برای logoutباید چیکار کنیم؟
برای این api از متد post استفاده میکنیم. ورودی اون refresh-token هست و از ایمپورت زیر استفاده میکنیم
from rest_framework_simplejwt.tokens import RefreshToken
و با متد()blacklist این توکن رو میفرستیم به لیست سیاه refresh-token ها که در دیتابیس mysql ذخیره میشن(بنابراین باید قبل از اجرای برنامه یکبار migrate کنیم)