您好,登錄后才能下訂單哦!
這篇文章主要介紹了DjangoRestFramework如何使用simpleJWT登陸認證,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
本文為 djangorestframework-simplejwt 使用記錄。
1. 安裝
pip install djangorestframework-simplejwt
2. 使用
創建 Django 項目及 app:
# 創建名為 simple 的工程 django-admin startproject simple # 創建名為 users 的應用 cd simple python manage.py startapp users
目錄結構如下:
在 `simple/settings.py` 中進行配置:
# simple/settings.py INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'users', # add 'rest_framework', # add 'rest_framework_simplejwt', # add ] REST_FRAMEWORK = { # add 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_simplejwt.authentication.JWTAuthentication', ) }
同步數據庫并創建超級用戶:
# 同步數據庫 python manage.py makemigrations python manage.py migrate # 創建超級用戶 python manage.py createsuperuser
在 `simple/urls.py` 中編寫路由:
# simple/urls.py from django.contrib import admin from django.urls import path from rest_framework_simplejwt.views import TokenRefreshView, TokenVerifyView, TokenObtainPairView urlpatterns = [ path('admin/', admin.site.urls), path('login/', TokenObtainPairView.as_view(), name='token_obtain_pair'), path('refresh/', TokenRefreshView.as_view(), name='token_refresh'), path('verify/', TokenVerifyView.as_view(), name='token_verify'), ]
使用 python http 工具進行接口測試:
http -f POST http://127.0.0.1:8000/login/ username=admin password=123456
3. 測試 API 接口
在 `users/views.py` 中編寫如下代碼:
# users/views.py from rest_framework import permissions from rest_framework.response import Response from rest_framework.views import APIView class MyView(APIView): permission_classes = [permissions.IsAuthenticated] def get(self, request, *args, **kwargs): return Response("Get information successfully!")
然后在 `simple/urls.py` 中添加路由:
# simple/urls.py from users import views # add urlpatterns = [ ... path('info/', views.MyView.as_view()), # add ]
使用 python http 工具進行測試:
4. 配置相關
# settings.py from datetime import timedelta SIMPLE_JWT = { 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5), # 訪問令牌的有效時間 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), # 刷新令牌的有效時間 'ROTATE_REFRESH_TOKENS': False, # 若為True,則刷新后新的refresh_token有更新的有效時間 'BLACKLIST_AFTER_ROTATION': True, # 若為True,刷新后的token將添加到黑名單中, # When True,'rest_framework_simplejwt.token_blacklist',should add to INSTALLED_APPS 'ALGORITHM': 'HS256', # 對稱算法:HS256 HS384 HS512 非對稱算法:RSA 'SIGNING_KEY': SECRET_KEY, 'VERIFYING_KEY': None, # if signing_key, verifying_key will be ignore. 'AUDIENCE': None, 'ISSUER': None, 'AUTH_HEADER_TYPES': ('Bearer',), # Authorization: Bearer <token> 'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION', # if HTTP_X_ACCESS_TOKEN, X_ACCESS_TOKEN: Bearer <token> 'USER_ID_FIELD': 'id', # 使用唯一不變的數據庫字段,將包含在生成的令牌中以標識用戶 'USER_ID_CLAIM': 'user_id', # 'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',), # default: access # 'TOKEN_TYPE_CLAIM': 'token_type', # 用于存儲令牌唯一標識符的聲明名稱 value:'access','sliding','refresh' # # 'JTI_CLAIM': 'jti', # # 'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp', # 滑動令牌是既包含到期聲明又包含刷新到期聲明的令牌 # 'SLIDING_TOKEN_LIFETIME': timedelta(minutes=5), # 只要滑動令牌的到期聲明中的時間戳未通過,就可以用來證明身份驗證 # 'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1), # path('token|refresh', TokenObtainSlidingView.as_view()) }
5. 自定義返回 token 信息
在 `users/serializers.py` 中編寫如下代碼:
# simple/serializers.py from rest_framework_simplejwt.serializers import TokenObtainPairSerializer class MyTokenObtainPairSerializer(TokenObtainPairSerializer): def validate(self, attrs): data = super().validate(attrs) refresh = self.get_token(self.user) data['refresh'] = str(refresh) data['access'] = str(refresh.access_token) data['username'] = self.user.username return data
在 'users/views.py` 及 `simple/urls.py` 中編寫如下代碼:
# users/views.py from rest_framework_simplejwt.views import TokenObtainPairView from users.serializers import MyTokenObtainPairSerializer class MyTokenObtainPairView(TokenObtainPairView): serializer_class = MyTokenObtainPairSerializer # simple/urls.py from users.views import MyTokenObtainPairView urlpatterns = [ ... # modify path('login/', MyTokenObtainPairView.as_view(), name='token_obtain_pair'), ]
測試 API,可以看到返回的信息中多了 username 信息:
http -f POST :8000/login/ username=admin password=123456
6. 手動頒發 token
手動頒發 token 主要針對用戶注冊的情況,用戶注冊完之后直接返回 token。
以下代碼即針對一個 user 對象手動頒發一個 token 并返回。(用戶注冊同理,即 user 對象為注冊后獲取的用戶)
# users/views.py class MyView(APIView): permission_classes = [permissions.IsAuthenticated] def get(self, request, *args, **kwargs): return Response("Get information successfully!") def post(self, request, *args, **kwargs): refresh = RefreshToken.for_user(request.user) content = { 'refresh': str(refresh), 'access': str(refresh.access_token), } return Response(content)
感謝你能夠認真閱讀完這篇文章,希望小編分享的“DjangoRestFramework如何使用simpleJWT登陸認證”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。