本文為 djangorestframework-simplejwt 使用記錄。(官方文檔)
1. 安裝
pip install djangorestframework-simplejwt
2. 使用
創(chuàng)建 Django 項目及 app:
# 創(chuàng)建名為 simple 的工程
django-admin startproject simple
# 創(chuàng)建名為 users 的應(yīng)用
cd simple
python manage.py startapp users
目錄結(jié)構(gòu)如下:
在 `simple/settings.py` 中進(jìn)行配置:
# 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',
)
}
同步數(shù)據(jù)庫并創(chuàng)建超級用戶:
# 同步數(shù)據(jù)庫
python manage.py makemigrations
python manage.py migrate
# 創(chuàng)建超級用戶
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 工具進(jìn)行接口測試:
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 工具進(jìn)行測試:
4. 配置相關(guān)
# 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', # 使用唯一不變的數(shù)據(jù)庫字段,將包含在生成的令牌中以標(biāo)識用戶
'USER_ID_CLAIM': 'user_id',
# 'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',), # default: access
# 'TOKEN_TYPE_CLAIM': 'token_type', # 用于存儲令牌唯一標(biāo)識符的聲明名稱 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. 手動頒發(fā) token
手動頒發(fā) token 主要針對用戶注冊的情況,用戶注冊完之后直接返回 token。
以下代碼即針對一個 user 對象手動頒發(fā)一個 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)
到此這篇關(guān)于DjangoRestFramework 使用 simpleJWT 登陸認(rèn)證完整記錄的文章就介紹到這了,更多相關(guān)DjangoRestFramework登陸認(rèn)證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Django restframework 框架認(rèn)證、權(quán)限、限流用法示例
- Django restframework 源碼分析之認(rèn)證詳解
- django restframework使用redis實現(xiàn)token認(rèn)證