استفاده از JWT در جنگو

سلام ٬ امروز قصد دارم روش استفاده از JWT در Django رو با شما عزیزان به اشتراک بزارم . به طور خلاصه اگه بخوام بگم JWT چی هست باید بگم که وقتی ما داریم API میسازیم برای اینکه بتونیم سیستم Authentication داشته باشیم از چندین راه میتونیم اینکار رو انجام بدیم مثل :سیستم Token خود Django Rest Frameworkسیستم JWT یا همون Json Web Tokenاصلا Token چی هست :قضیه ازین قرار است که توی سیستم هایی که از API استفاده میکنند ( مثلا شما Back-end رو با Django میزنین و برای Front-end از فریمورک های javascript مثل vue.js یا react استفاده میکنن ) دیگه نمیتونیم از session خود django استفاده کنیم پس اینجا راه جایگزینی برای اینکار وجود داره و اونم چیزی هست به اسم Token ٬ جادی تو یکی از ویدیو هاش توکن رو اینطوری توضیح داد :" فرض کنین شما میرین یه کنسرت توی خارج از کشور و بار اول که وارد میشین بلیط رو نشون میدین تا بتونین وارد بشین و اونجا به شما یه دستبند میدن که مخصوص شما هست و هروقت خواستین میتونین از سالن خارج بشین و برای اینکه بتونین دوباره وارد بشین دیگه نیازی نیست بلیط رو نشون بدین و نشون دادن اون دستبند کفایت میکنه . در اصل اینجا اون دستنبد به نیروهای security اون کنسرت این اطمینان رو میده که شما مثلا فلانی هستین و اجازه ورود به سالن رو دارین و قطعا بلیت هم دارین"پس Token این شکلی عمل میکنه که شما یه بار username و password رو وارد میکنین و به شما یه Token اختصاص داده میشه و ازین پس هربار بخواین هرکاری رو انجام بدین دیگه نیاز نیست Username و password رو وارد کنین و با نشون دادن اون Token میتونین کاری که میخواستین رو انجام بدین . این کار باعث میشه :از وارد کردن username و password برای هر کاری که میخواین انجام بدین جلوگیری بشهباعث میشه اگه End-point های شما لو رفت کسی نتونه ازش سو استفاده کنه ( چون token نداره)خوب الان دیگه می دونیم Token چی هست و چه کاربردی داره . من در بالا ۲ تا از چزایی که متونین سیستم Token برای Api های خودمون داشته باشیم رو ذکر کردم ( قطعا روش های دیگری هم وجود داره ) و امروز قصد دارم نحوه کار مورد دوم یا همون JWT رو با شما به اشتراک بزارم . پس در ادامه همراه باشین .نصب و استفاده از JWT در Django Rest Framework :خوب در مرحله اول نیاز دارم JWT رو توی پروژه خودمون نصب کنیم که از دستور زیر میتونین برای اینکار استفاده کنین :pip install djangorestframework-simplejwtپس از پایان نصب دستورات زیر رو در فایل settings.py خود اضافه کنید :REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_simplejwt.authentication.JWTAuthentication', )}حالا ما باید ۲ تا end-point بسازیم :یکی برای اینکه وقتی username و password کاربر رو بهش بفرستیم و Token مخصوص اون کاربر رو دریافت کنیمیکی برای وقتی که Token کاربر Expire شده ( منقضی شده ) و بتونیم دوباره Token جدید برای کاربر دریافت کنیمبرای اینکار path های زیر رو به فایل urls.py اصلی پروژه اضافه کنید :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'), ]خوب حالا فرض کنید ما یه کاربر داریم و میخوایم Token کاربر رو دریافت کنیم . برای اینکار باید username و password کاربر رو به url هایی که در بالا ساختیم با متد POST بفرستیم ( من برای اینکار از Curl استفاده میکنم و در اینجا شما میتونین از Postman یا مستقیم از Front-end این کار رو انجام بدین ) .curl \ -X POST \ -H &quotContent-Type: application/json&quot \ -d '{&quotusername&quot: &quottest&quot, &quotpassword&quot: &quottest1234&quot}' \ http://localhost:8000/api/token/خوب اگه دقت کنید من به ادرس /http://localhost:8000/api/token مقدار username و password کاربر رو با متد POST ارسال کردم و در جواب باید چیزی شبیه کد زیر رو به عنوان Response دریافت کنین :{ &quotaccess&quot:&quoteyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX3BrIjoxLCJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiY29sZF9zdHVmZiI6IuKYgyIsImV4cCI6MTIzNDU2LCJqdGkiOiJmZDJmOWQ1ZTFhN2M0MmU4OTQ5MzVlMzYyYmNhOGJjYSJ9.NHlztMGER7UADHZJlxNG0WSi22a2KaYSfd1S-AuT7lU&quot, &quotrefresh&quot:&quoteyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX3BrIjoxLCJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImNvbGRfc3R1ZmYiOiLimIMiLCJleHAiOjIzNDU2NywianRpIjoiZGUxMmY0ZTY3MDY4NDI3ODg5ZjE1YWMyNzcwZGEwNTEifQ.aEoAYkSJjoWH1boshQAaTkf8G3yn0kapko6HFRt7Rh4&quot}در بالا مشاهده میکنین من ۲ تا مقدار دریافت کردم ٬ یکی access و یکی refresh که اینها : در اصل access در اصل توکن اصلی هست که در هربار استفاده از api باید توی header ارسال بشهو refresh رو وقتی توکن access در اصطلاح expire شده رو به /http://localhost:8000/api/token/refresh میفرستیم تا توکن جدید رو دریافت کنیم مانند زیر :curl \ -X POST \ -H &quotContent-Type: application/json&quot \ -d '{&quotrefresh&quot:&quoteyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX3BrIjoxLCJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImNvbGRfc3R1ZmYiOiLimIMiLCJleHAiOjIzNDU2NywianRpIjoiZGUxMmY0ZTY3MDY4NDI3ODg5ZjE1YWMyNzcwZGEwNTEifQ.aEoAYkSJjoWH1boshQAaTkf8G3yn0kapko6HFRt7Rh4&quot}' \ http://localhost:8000/api/token/refresh/و چیزی مثل زیر رو دریافت میکنید :{&quotaccess&quot:&quoteyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX3BrIjoxLCJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiY29sZF9zdHVmZiI6IuKYgyIsImV4cCI6MTIzNDU2LCJqdGkiOiJmZDJmOWQ1ZTFhN2M0MmU4OTQ5MzVlMzYyYmNhOGJjYSJ9.NHlztMGER7UADHZJlxNG0WSi22a2KaYSfd1S-AuT7lU&quot}که حاوی توکن جدید میباشد . در اینجا باید بگم که Token هر 5 دقیقه منقضی میشه که قابل افزایش هم هست .استفاده از Token در Django Rest framework :فرض کنین یه اپ ساختم به اسم hello و در قسمت View اون اپ کد زیر رو وارد کردم :from rest_framework.views import APIViewfrom rest_framework.response import Responsefrom rest_framework.permissions import IsAuthenticatedclass HelloView(APIView): permission_classes = (IsAuthenticated,) def get(self, request): content = {'message': 'Hello, World!'} return Response(content)در بالا دقت کنید که من بالای فانکشن get یه مقداری رو وارد کردم " (permission_classes = (IsAuthenticated " این به این معنی هست که هرکسی بخواد این ویو رو call کنه باید Token داشته باشه .حالا من یه url برای این view میسازم :from django.urls import pathfrom myapi.core import viewsurlpatterns = [ path('hello/', views.HelloView.as_view(), name='hello'),]پس اگه بخوام این api رو کال کنم مثلا باید url زیر رو با متد get در اصطلاح call کنم :http://localhost:8000/api/hello/بیاین باهم امتحان کنیم :curl \ -X POST \ http://localhost:8000/api/token/و در اینجا انتظار ما این هست که مقدار زیر به ما برگشت داده بشه :{'message': 'Hello, World!'}اما مقدار زیر برگشت داده خواهد شد :{ &quotdetail&quot: &quotGiven token not valid for any token type&quot, &quotcode&quot: &quottoken_not_valid&quot, &quotmessages&quot: [ { &quottoken_class&quot: &quotAccessToken&quot, &quottoken_type&quot: &quotaccess&quot, &quotmessage&quot: &quotToken is invalid or expired&quot } ]}که داره میگه یا توکن رو در header این request که فرستادین قرار ندادین یا اینکه Token شما expire شده . پس برای اینکار باید مثل زیر عمل کنیم :curl \ -H &quotAuthorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX3BrIjoxLCJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiY29sZF9zdHVmZiI6IuKYgyIsImV4cCI6MTIzNDU2LCJqdGkiOiJmZDJmOWQ1ZTFhN2M0MmU4OTQ5MzVlMzYyYmNhOGJjYSJ9.NHlztMGER7UADHZJlxNG0WSi22a2KaYSfd1S-AuT7lU&quot \ http://localhost:8000/api/hello/در بالا من توکن access رو در header به صورت زیر قرار دادم :&quotAuthorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX3BrIjoxLCJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiY29sZF9zdHVmZiI6IuKYgyIsImV4cCI6MTIzNDU2LCJqdGkiOiJmZDJmOWQ1ZTFhN2M0MmU4OTQ5MzVlMzYyYmNhOGJjYSJ9.NHlztMGER7UADHZJlxNG0WSi22a2KaYSfd1S-AuT7lU&quotو اگه تمام مراحل رو درست رفته باشین باید چیزی مثل زیر رو دریافت کنین :{'message': 'Hello, World!'}تبریک ! شما به راحتی از JWT برای ساخت و Authentication استفاده کردین . در صورت داشتن هرگونه مشکل یا سوال حتما در قسمت کامنت های زیر این پست من رو در جریان قرار بدین . در اخر اگه نیاز به اطلاعات بیشتر داشتین میتونین به لینک زیر مراجعه کنید :سایت JWTخوش و خرم باشین .