django用戶認證

基礎(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,過期時間組成。


image.png

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"))
]
image.png

編寫登錄視圖

我是有個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返回


image.png

image.png

帶token返回


image.png

image.png

token就是在請求時添加到請求頭上的玛追,有token并且服務(wù)端驗證成功則走成功流程税课,驗證失敗走失敗流程闲延。不帶token DRF則獲取不到請求用戶,使用默認的AnonymousUser用戶韩玩。


image.png

開啟請求所有路由必須通過認證

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將無法訪問


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末垒玲,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子找颓,更是在濱河造成了極大的恐慌合愈,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件击狮,死亡現(xiàn)場離奇詭異想暗,居然都是意外死亡,警方通過查閱死者的電腦和手機帘不,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門说莫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人寞焙,你說我怎么就攤上這事储狭。” “怎么了捣郊?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵辽狈,是天一觀的道長。 經(jīng)常有香客問我呛牲,道長刮萌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任娘扩,我火速辦了婚禮着茸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘琐旁。我一直安慰自己涮阔,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布灰殴。 她就那樣靜靜地躺著敬特,像睡著了一般。 火紅的嫁衣襯著肌膚如雪牺陶。 梳的紋絲不亂的頭發(fā)上伟阔,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音掰伸,去河邊找鬼皱炉。 笑死,一個胖子當著我的面吹牛碱工,可吹牛的內(nèi)容都是我干的娃承。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼怕篷,長吁一口氣:“原來是場噩夢啊……” “哼历筝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起廊谓,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤梳猪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蒸痹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體春弥,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年叠荠,在試婚紗的時候發(fā)現(xiàn)自己被綠了匿沛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡榛鼎,死狀恐怖逃呼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情者娱,我是刑警寧澤抡笼,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站黄鳍,受9級特大地震影響推姻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜框沟,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一藏古、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧忍燥,春花似錦校翔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至哎甲,卻和暖如春蔫敲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背炭玫。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工奈嘿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吞加。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓裙犹,卻偏偏與公主長得像尽狠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子叶圃,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容