基礎(chǔ)token認證
因為session的認證方式有一些問題脆侮,所以采用token認證的方式缰贝,通過賬號密碼認證后會返回一個token足丢,之后瀏覽器每次請求都攜帶這個token. 有則表示登錄過了奸远,無則需要重新登錄。
DRF提供了一個TokenAuthentication狮斗,但是這種方式需要數(shù)據(jù)庫存儲token, 所以采用互聯(lián)網(wǎng)比較流行的做法jwt(JSON Web Token)也是較好的選擇,并且DRF也提供了第三方插件。
JWT官網(wǎng) https://jwt.io/
官網(wǎng) https://github.com/jazzband/djangorestframework-simplejwt
文檔 https://django-rest-framework-simplejwt.readthedocs.io/en/latest/getting_started.html
要求:Python 3.7+、Django 2.2+实昨、DRF 3.10+
安裝
pip install djangorestframework-simplejwt
setting.py中添加配置
INSTALLED_APPS = [
,盐固,荒给,,刁卜,志电,,蛔趴,挑辆,
'djangorestframework-simplejwt'
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES':[
'rest_framework_simplejwt.authentication.JWTAuthentication',
]}
主路由配置 urls.py
from django.urls import path,include
from rest_framework_simplejwt.views import (
TokenObtainPairView,
TokenRefreshSlidingView
)
tobview=TokenObtainPairView.as_view()
urlpatterns = [
path('login/', tobview),
path('token/', tobview),
path('token/refresh', TokenRefreshSlidingView.as_view()),
]
TokenObtainPairView的父類TokenViewBase繼承自GenericAPIView,且只實現(xiàn)了post方法孝情,所以只能使用POST請求鱼蝉。
請求測試
GET http://127.0.0.1:8000/token/
返回:400
{
"code": 10000,
"message": "非法請求"
}
POST http://127.0.0.1:8000/token/
{
"username": [
"這個字段是必填項。"
],
"password": [
"這個字段是必填項咧叭。"
]
}
必須提交賬號密碼到接口蚀乔,認證成功則返回token,認證失敗則返回401.
提交信息后,內(nèi)部會查數(shù)據(jù)庫和對比密碼菲茬,認證成功就返回token信息吉挣,token 由userid,過期時間組成。
JWT分為3部分婉弹,頭睬魂、數(shù)據(jù)、簽名镀赌,中間那部分使用Base64解碼可以得到
{"token_type":"access","exp":1628792597,"jti":"df76bb1f43344eb3959dc2fa0c93e1
61","user_id":1}
jti就是jwt的id氯哮,唯一標識。user_id就是認證成功后返回的用戶id值商佛。exp過期的時間點的時間戳喉钢,默認5分鐘后。
refresh是access短時間token過期后良姆,對access延期的肠虽。
token的過期時間設(shè)置 setting.py
from datetime import timedelta
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(hours=1),
#'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
}
登錄測試
主路由添加user的二級路由
urlpatterns = [
-----------------
path('users/',include("user.urls"))
]
編寫登錄視圖
我是有個user 應用,我在user中的view.py中寫
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework.request import Request
@api_view(['POST', 'GET'])
def test(request:Request):
print('~' * 30)
print(request.COOKIES, request._request.headers)
print(request.data) # 被DRF處理為字典
print(request.user) # 可能是匿名用戶
print(request.auth)
print('=' * 30)
if request.auth:
return Response({'test':10000})
else:
return Response({'test':20000})
編寫二級路由 user/url.py
from django.urls import path
from .views import test
urlpatterns = [
path('test/',test)
]
不帶token返回
帶token返回
token就是在請求時添加到請求頭上的玛追,有token并且服務(wù)端驗證成功則走成功流程税课,驗證失敗走失敗流程闲延。不帶token DRF則獲取不到請求用戶,使用默認的AnonymousUser用戶韩玩。
開啟請求所有路由必須通過認證
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES':[
'rest_framework_simplejwt.authentication.JWTAuthentication',
],
'EXCEPTION_HANDLER': 'utils.exceptions.global_exception_handler',
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated'],
}
此時不提供token將無法訪問