最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django基于Token的驗證使用的實現(xiàn)

 更新時間:2021年09月18日 10:47:37   作者:ProgramNotes  
本文主要介紹了Django基于Token的驗證使用的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

什么是Token

Token字面意思是令牌,功能跟Session類似,也是用于驗證用戶信息的,Token是服務(wù)端生成的一串字符串,當(dāng)客戶端發(fā)送登錄請求時,服務(wù)器便會生成一個Token并將此Token返回給客戶端,作為客戶端進(jìn)行請求的一個標(biāo)識以后客戶端只需帶上這個Token前來請求數(shù)據(jù)即可,無需再次帶上用戶名和密碼。與session的不同之處在于,Session是將用戶信息存儲在服務(wù)器中保持用戶的請求狀態(tài),而Token在服務(wù)器端不需要存儲用戶的登錄記錄,客戶端每次向服務(wù)端發(fā)送請求的時候都會帶上服務(wù)端發(fā)給的Token,服務(wù)端收到請求后去驗證客戶端請求里面帶著Token,如果驗證成功,就向客戶端返回請求的數(shù)據(jù)。

為什么要用Token

1.Token無需存儲降低服務(wù)器成本,session是將用戶信息存儲在服務(wù)器中的,當(dāng)用戶量增大時服務(wù)器的壓力也會隨著增大。

2.防御CSRF跨站偽造請求攻擊,session是基于cookie進(jìn)行用戶識別的, cookie如果被截獲,用戶信息就容易泄露。

3.擴展性強,session需要存儲無法共享,當(dāng)搭建了多個服務(wù)器時其他服務(wù)器無法獲取到session中的驗證數(shù)據(jù)用戶無法驗證成功。而Token可以實現(xiàn)服務(wù)器間共享,這樣不管哪里都可以訪問到。

4.Token可以減輕服務(wù)器的壓力,減少頻繁的查詢數(shù)據(jù)庫。

5.支持跨域訪問

6.適用于移動平臺應(yīng)用

基于 Token 的身份驗證流程

  •  客戶端使用用戶名跟密碼請求登錄
  • 服務(wù)端收到請求開始驗證用戶名與密碼
  • 驗證成功后,服務(wù)端生成一個 Token并把這個 Token 發(fā)送給客戶端
  • 客戶端收到 Token 以后可以把它存儲起來,可以存放在 Cookie 里或者 Local Storage 里
  • 客戶端再次向服務(wù)端請求資形式源的時候攜帶服務(wù)端生成的 Token發(fā)送給服務(wù)器
  • 服務(wù)端收到請求,然后去驗證客戶端請求里面攜帶的 Token,如果驗證成功,就向客戶端返回請求的數(shù)據(jù),否則拒絕請求。

Token的組成形式

JWT 標(biāo)準(zhǔn)的 Token 有三個部分:

header(頭部)

每個 Token 里面都有一個 header,也就是頭部數(shù)據(jù),里面包含了使用的算法告訴我們這個token 是否加密。如果是未加密的 Token ,這個屬性可以設(shè)置成 none。

payload(數(shù)據(jù))

Payload 里面是 Token 要包含的一些數(shù)據(jù),內(nèi)容可以自行定義,也可以參考標(biāo)準(zhǔn)字段(簡寫:全稱)iss:Issuer、sub:Subject、exp:Expiration time、iat:Issued at。

signature(簽名)

將Header和Playload使用Base64編碼生成一下再加入簽名字符用加密算法加密一遍,得到唯一的簽名,用來防止其他人來篡改Token中的信息。

Django如何使用Token

即然我們知道Token的組成方式,那么我們就來創(chuàng)建下Token,首定義Header和Payload,header中定義token類型和加密方式,Payload定義具體內(nèi)容,如何用戶名,發(fā)行時間,過期時間等。

headers={'type':'JWT','alg':'HS256'}
payloads={'iss':user,'iat':time.time()}

分別加密headers和payloads,Django中內(nèi)置了一個模塊django.core.signing,可以用它來加密和解密任何數(shù)據(jù),直接調(diào)用dumps和load函數(shù)來實現(xiàn)即可,將headers和payloads加密再用signing.dumps加密再用signing.b64_encode編碼得到一串字符串,然后用MD5加密headers和payloads生成唯一的signature,最后把headers、payloads、signature組合成Token,下面是測試代碼:

接下來把Token帶入到項目中來使用下,為了方便我們把加密封裝成方法直接調(diào)用,這里我分別寫了Encrypt、Decrypt、Token方法來加密解密和封裝Token,最后把token帶到數(shù)據(jù)中返回給前端,這里我用JsonResponse返回數(shù)據(jù),data里面存放用戶請求的數(shù)據(jù),code返回請求的狀態(tài),token里面存放我們的token令牌。

HEADER={
    'type':'JWT',
    'alg':'HS256'
}
 
def Encrypt(value):
    data=signing.dumps(value)
    data=signing.b64_encode(data.encode()).decode()
    return data
 
def Decrypt(value):
    data=signing.b64_decode(value.encode()).decode()
    data=signing.loads(data)
    return data
 
def Token(headers,payloads):
    header=Encrypt(headers)
    payload=Encrypt(payloads)
    md5=hashlib.md5()
    md5.update(("%s.%s"%(header,payload)).encode())
    signature=md5.hexdigest()
    token="%s.%s.%s"%(header,payload,signature)
    return token
 
def login(request):
    user = request.POST.get('username').strip()
    pwd = request.POST.get('password').strip()
    print(request.method)
    # print(user,pwd)
    obj=models.Admin.objects.filter(name=user)
    if obj:
        print('456789')
        passwd=models.Admin.objects.filter(name=user).values('password')[0]['password']
        ret=check_password(pwd,passwd)
        userobj=models.Admin.objects.get(name=user)
        print('ret=',ret)
        if ret:
            headers=HEADER
            data={'phone': userobj.phone, 'mail': userobj.mail}
            payloads={'iss': userobj.name, 'iat':time.time()}
            token=Token(headers,payloads)
            print(token)
            info={'token':token}
            info['code']=200
            info['data']=data
            print(info)
            return JsonResponse(info)
        else:
            return  HttpResponse('400')
    else:
        return HttpResponse('400')
 

這時前端請求登錄后可以接受到后臺返回的info數(shù)據(jù),里面包含了data、token和caode,這時我們可以把獲取到的token存起來,一般存放在客戶端的localstorage或者sessionStorage中,下次再次請求時把這個token再發(fā)給服務(wù)器,服務(wù)器驗證成功后就會返回所需的數(shù)據(jù)了。

到此這篇關(guān)于Django基于Token的驗證使用的實現(xiàn)的文章就介紹到這了,更多相關(guān)Django Token驗證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python利用pandas和matplotlib實現(xiàn)繪制圓環(huán)圖

    Python利用pandas和matplotlib實現(xiàn)繪制圓環(huán)圖

    在可視化的過程中,圓環(huán)圖是一種常用的方式,特別適合于展示各類別占比情況,本文將介紹如何使用 Python中的 pandas 和 matplotlib 庫,來制作一個店鋪銷量占比的圓環(huán)圖,需要的可以參考下
    2023-11-11
  • 利用Python實時獲取steam特惠游戲數(shù)據(jù)

    利用Python實時獲取steam特惠游戲數(shù)據(jù)

    Steam是由美國電子游戲商Valve于2003年9月12日推出的數(shù)字發(fā)行平臺,被認(rèn)為是計算機游戲界最大的數(shù)碼發(fā)行平臺之一。本文將利用Python實時獲取steam特惠游戲數(shù)據(jù),感興趣的可以嘗試一下
    2022-06-06
  • 使用Python進(jìn)行目錄的對比方法

    使用Python進(jìn)行目錄的對比方法

    今天小編就為大家分享一篇使用Python進(jìn)行目錄的對比方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • Python實戰(zhàn)小游戲飛機大戰(zhàn)詳解

    Python實戰(zhàn)小游戲飛機大戰(zhàn)詳解

    飛機大戰(zhàn)想必是很多人童年時期的經(jīng)典游戲,我們依舊能記得抱個老人機娛樂的場景,下面這篇文章主要給大家介紹了關(guān)于如何利用python寫一個簡單的飛機大戰(zhàn)小游戲的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • python如何求2-1000內(nèi)的所有回文素數(shù)

    python如何求2-1000內(nèi)的所有回文素數(shù)

    這篇文章主要介紹了python如何求2-1000內(nèi)的所有回文素數(shù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 在服務(wù)器上運行python文件詳細(xì)步驟

    在服務(wù)器上運行python文件詳細(xì)步驟

    很多小伙伴想知道如何在服務(wù)器上跑python程序的方法,那么這篇文章主要給大家介紹了關(guān)于在服務(wù)器上運行python文件的詳細(xì)步驟,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02
  • Python中的枚舉函數(shù)enumerate()的具體用法

    Python中的枚舉函數(shù)enumerate()的具體用法

    本文主要介紹了Python中的枚舉函數(shù)enumerate()的具體用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Python ldap實現(xiàn)登錄實例代碼

    Python ldap實現(xiàn)登錄實例代碼

    今天給大家分享python idap實現(xiàn)登錄的實例代碼,代碼簡單易懂,需要的朋友一起看看吧
    2016-09-09
  • Python常用隨機數(shù)與隨機字符串方法實例

    Python常用隨機數(shù)與隨機字符串方法實例

    這篇文章主要介紹了Python常用隨機數(shù)與隨機字符串方法實例,本文講解了隨機整數(shù)、隨機選取0到100間的偶數(shù)、隨機浮點數(shù)、隨機字符串等常用隨機方法,需要的朋友可以參考下
    2015-04-04
  • Python批量修改文本文件內(nèi)容的方法

    Python批量修改文本文件內(nèi)容的方法

    這篇文章主要介紹了Python批量修改文本文件內(nèi)容的方法的相關(guān)資料,需要的朋友可以參考下
    2016-04-04

最新評論

瑞丽市| 克拉玛依市| 宜章县| 和顺县| 读书| 罗山县| 黄骅市| 河津市| 平和县| 唐河县| 宁蒗| 阆中市| 新兴县| 台南县| 崇明县| 曲松县| 临洮县| 鱼台县| 突泉县| 涞水县| 通化市| 武乡县| 博客| 绥阳县| 镇坪县| 林甸县| 宜丰县| 泰安市| 鸡西市| 崇文区| 德阳市| 汕头市| 梁平县| 霞浦县| 翁源县| 赞皇县| 孟津县| 都昌县| 鄂尔多斯市| 霍林郭勒市| 长武县|