欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Django中的JWT身份驗(yàn)證的實(shí)現(xiàn)

 更新時(shí)間:2021年05月07日 16:39:29   作者:林-金鵬  
這篇文章主要介紹了Django中的JWT身份驗(yàn)證的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1.認(rèn)證與授權(quán)

1.驗(yàn)證:身份驗(yàn)證是驗(yàn)證個(gè)人或設(shè)備標(biāo)識(shí)的過(guò)程。身份驗(yàn)證過(guò)程之一是登錄過(guò)程。注冊(cè)網(wǎng)站后,您的信息(ID,密碼,名稱,電子郵件等)將存儲(chǔ)在其數(shù)據(jù)庫(kù)中。之后,您無(wú)需創(chuàng)建帳戶即可提供信息。相反,您只需要提供用戶名和密碼來(lái)驗(yàn)證您的身份,網(wǎng)站就會(huì)自動(dòng)知道您正在訪問(wèn)。

2.授權(quán):授權(quán)是用于確定用戶特權(quán)或訪問(wèn)級(jí)別的安全機(jī)制。在許多社區(qū)網(wǎng)站上,只有上傳帖子和管理員的人才能刪除它。當(dāng)其他人嘗試刪除帖子時(shí),網(wǎng)站應(yīng)該拋出錯(cuò)誤(但是在許多情況下,他們甚至看不到刪除按鈕)。因此,對(duì)于每個(gè)請(qǐng)求,用戶都需要證明自己具有權(quán)限。

2.什么是JWT

JSON Web令牌(JWT)是一種開放標(biāo)準(zhǔn)(RFC 7519),它定義了一種緊湊且自包含的方式,用于在各方之間安全地將信息作為JSON對(duì)象進(jìn)行傳輸。您可以使用JWT對(duì)請(qǐng)求進(jìn)行身份驗(yàn)證和授權(quán)。

JWT由三個(gè)串聯(lián)的Base64url編碼的字符串(標(biāo)頭,有效負(fù)載和簽名)組成,并用點(diǎn)號(hào)(,)分隔。標(biāo)頭包含有關(guān)令牌和加密算法類型的元數(shù)據(jù)。簽名用于驗(yàn)證令牌的可信度。有效負(fù)載包含用于身份驗(yàn)證和授權(quán)的所有必要數(shù)據(jù)。

3.存儲(chǔ)JWT

當(dāng)用戶登錄時(shí),服務(wù)器將創(chuàng)建JWT并將其發(fā)送到客戶端。然后,客戶端將其存儲(chǔ)到會(huì)話存儲(chǔ)或本地存儲(chǔ)。每次客戶端向服務(wù)器端發(fā)送需要身份驗(yàn)證或授權(quán)的請(qǐng)求時(shí),都會(huì)在授權(quán)標(biāo)頭上發(fā)送JWT。易受XSS(跨站點(diǎn)腳本)攻擊:會(huì)話和本地存儲(chǔ)可通過(guò)JavaScript訪問(wèn)。惡意第三方可以將其JS注入網(wǎng)站,從而可以向API發(fā)出請(qǐng)求。

服務(wù)器將JWT存儲(chǔ)在Cookie中,并使用存儲(chǔ)在Cookie中的JWT驗(yàn)證用戶。Cookies容易受到CSRF的攻擊,因?yàn)樗鼈冸S每個(gè)請(qǐng)求一起發(fā)送。因此,惡意的第三方可以輕松地提出意想不到的請(qǐng)求。

4.Django中的JWT

# settings.py
SECRET_KEY = 'abcde1234',
JWT_ALGORITHM = 'HS256'
# user/views.py
import json
from datetime import datetime, timdelta
from django.conf import settings
from django.http import JsonResponse
from django.views import View

import bcrypt
import jwt
from .models import User
from token_utils import user_token

class UserSignInView(View):
    def post(self, request):
        try:
            data = json.loads(request.body)
            username = data['username']
            pw_input = data['password']
            user = User.objects.filter(username=username).first()

            if user is None:
                return JsonResponse({"message": "INVALID_USERNAME"}, status=401)
            if bcrypt.checkpw(pw_input.encode('utf-8'),
                              user.password.encode('utf-8')):
                key = settings.SECRET_KEY
                algorithm = settings.JWT_ALGORITHM
                token = jwt.encode(
                    {
                        'iss': 'me',
                        'id': user.id,
                        'exp': datetime.utcnow() + timedelta(days=14)
                    }, key, algorithm=algorithm).decode('utf-8')

                response = JsonResponse(
                    {
                        'message': 'SUCCESS'
                    }, status=200
                )

                # 當(dāng)使用本地/會(huì)話存儲(chǔ)而不是Cookie時(shí),只需在JsonResponse中發(fā)送令牌
                if data.get('remember_me') is not None:
                    max_age = 14*24*60*60 # 14 days
                    expires = datetime.strftime(
                        datetime.utcnow() + timedelta(seconds=max_age),
                        "%Y-%m-%d %H:%M:%S"
                    )
                    response.set_cookie(
                        'token',
                        token,
                        max_age=max_age,
                        expires=expires,
                        httponly=True
                    )
                    return response
            return JsonResponse({"message": "WRONG_PASSWORD"}, status=401)

        except KeyError as e:
            return JsonResponse({'message': f'KEY_ERROR: {e}'}, status=400)
        except ValueError as e:
            return JsonResponse({'message': f'VALUE_ERROR: {e}'}, status=400)

# token_utils.py
import json
from django.conf import settings
from django.http import JsonResponse
import jwt
from user.models import User

def user_token(func):
    def wrapper(self, request, *args, **kwargs):
        try:
            token = request.COOKIES.get('token')
            # token = request.headers.get('token')

            key = settings.SECRET_KEY
            algorithm = settings.JWT_ALGORITHM

            if token is None:
                return JsonResponse({"message": "INVALID_TOKEN"}, status=401)

            decode = jwt.decode(token, key, algorithm=algorithm)
            request.user = User.objects.get(id=decode['id'])

        except jwt.ExpiredSignatureError:
            return JsonResponse({"message": "EXPIRED_TOKEN"}, status=400)
        return func(self, request, *args, **kwargs)
    return wrapper

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

相關(guān)文章

  • python聊天程序?qū)嵗a分享

    python聊天程序?qū)嵗a分享

    這篇文章主要介紹了用python寫的聊天程序,開兩個(gè)線程,即是客戶端,也是服務(wù)器,大家可以參考使用
    2013-11-11
  • 常用的Python代碼調(diào)試工具總結(jié)

    常用的Python代碼調(diào)試工具總結(jié)

    今天給大家?guī)?lái)的是關(guān)于Python的相關(guān)知識(shí),文章圍繞著Python代碼調(diào)試工具展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • python解釋器安裝教程的方法步驟

    python解釋器安裝教程的方法步驟

    這篇文章主要介紹了python解釋器安裝教程的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 關(guān)于pygame自定義窗口創(chuàng)建及相關(guān)操作指南

    關(guān)于pygame自定義窗口創(chuàng)建及相關(guān)操作指南

    對(duì)于開發(fā)一個(gè)游戲來(lái)說(shuō),窗口的顯示肯定是前提中的前提,對(duì)于pygame來(lái)說(shuō),只需要一小段代碼就可以初始化窗口,下面這篇文章主要給大家介紹了關(guān)于pygame自定義窗口創(chuàng)建及相關(guān)操作的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • 以911新聞為例演示Python實(shí)現(xiàn)數(shù)據(jù)可視化的教程

    以911新聞為例演示Python實(shí)現(xiàn)數(shù)據(jù)可視化的教程

    這篇文章主要介紹了以911新聞為例演示Python實(shí)現(xiàn)數(shù)據(jù)可視化的教程,主要基于NMF主題模型,需要的朋友可以參考下
    2015-04-04
  • Python處理RSS、ATOM模塊FEEDPARSER介紹

    Python處理RSS、ATOM模塊FEEDPARSER介紹

    這篇文章主要介紹了Python處理RSS、ATOM模塊FEEDPARSER介紹,本文只是做個(gè)入門級(jí)的簡(jiǎn)潔介紹,需要的朋友可以參考下
    2015-02-02
  • python 如何調(diào)用 dubbo 接口

    python 如何調(diào)用 dubbo 接口

    這篇文章主要介紹了python 如何調(diào)用 dubbo 接口,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-09-09
  • python tkinter控件布局項(xiàng)目實(shí)例

    python tkinter控件布局項(xiàng)目實(shí)例

    這篇文章主要介紹了python tkinter控件布局項(xiàng)目實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • python實(shí)現(xiàn)簡(jiǎn)單飛行棋

    python實(shí)現(xiàn)簡(jiǎn)單飛行棋

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)單飛行棋,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • python實(shí)現(xiàn)從web抓取文檔的方法

    python實(shí)現(xiàn)從web抓取文檔的方法

    這篇文章主要介紹了python實(shí)現(xiàn)從web抓取文檔的方法,以抓取人人網(wǎng)頁(yè)面為例講述了完整的web文檔抓取方法,需要的朋友可以參考下
    2014-09-09

最新評(píng)論