0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

后端JWT接口認(rèn)證的操作流程

科技綠洲 ? 來源:Python實用寶典 ? 作者:Python實用寶典 ? 2023-10-31 11:20 ? 次閱讀

為了反爬或限流節(jié)流,后端編寫接口時,大部分 API 都會進行權(quán)限認(rèn)證,只有認(rèn)證通過,即:數(shù)據(jù)正常及未過期才會返回數(shù)據(jù),否則直接報錯

本篇文章以 Django 為例,聊聊后端 JWT 接口認(rèn)證的操作流程

2. JWT 介紹

JWT 全稱為 JSON Web Token,是目前主流的跨域認(rèn)證解決方案

數(shù)據(jù)結(jié)構(gòu)由 3 部分組成,中間由「 **. ** 」分割開

它們分別是:

  • Header 頭部
  • Payload 負(fù)載
  • Signature 簽名
# JWT 數(shù)據(jù)的格式
# 組成方式:頭部.負(fù)載.簽名
Header.Payload.Signature

其中

Header 用于設(shè)置簽名算法及令牌類型,默認(rèn)簽名算法為 「 HS256 」,令牌類型可以設(shè)置為「 JWT 」

Payload 用于設(shè)置需要傳遞的數(shù)據(jù),包含:iss 簽發(fā)人、exp 過期時間、iat 簽發(fā)時間等

Signature 用于對 Header 和 Payload 進行簽名,默認(rèn)使用的簽名算法為 Header 中指定的算法

# JWT 數(shù)據(jù)組成
# Header. Payload. Signature
# Header:{ "alg": "HS256","typ": "JWT"}
# Payload:iss、exp、iat等
# Signature:簽名
Signature = HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

PS:base64UrlEncode 相比 Base64 算法,會將結(jié)果中的「 = 」省略、「 + 」替換成「 - 」、「 / 」替換成「 _ 」

3. 實戰(zhàn)一下

首先,在虛擬環(huán)境中安裝 JWT 依賴包

# 安裝jwt依賴包
pip3 install pyjwt

然后,定義一個方法用于生成 JWT Token

需要注意的是,生成 JWT Token 時需要指定過期時間、加密方式等

import time
import jwt
from django.conf import settings

def generate_jwt_token(user):
    """
    生成一個JWT Token
    :param user:
    :return:
    """
    # 設(shè)置token的過期時間戳
    # 比如:設(shè)置7天過期
    timestamp = int(time.time()) + 60 * 60 * 24 * 7

    # 加密生成Token
    # 加密方式:HS256
    return jwt.encode({"userid": user.pk, "exp": timestamp}, settings.SECRET_KEY,'HS256')

接著,編寫一個認(rèn)證類

該類繼承于「 BaseAuthentication 」基類,重寫內(nèi)部函數(shù)「 authenticate() 」,對請求參數(shù)進行 JWT 解密,并進行數(shù)據(jù)庫查詢,只有認(rèn)證通過才返回數(shù)據(jù),否則拋出異常

import time

import jwt
from django.conf import settings
from django.contrib.auth import get_user_model
from rest_framework import exceptions
from rest_framework.authentication import BaseAuthentication, get_authorization_header

User = get_user_model()

class JWTAuthentication(BaseAuthentication):
    """自定義認(rèn)證類"""

    keyword = 'jwt'
    model = None

    def get_model(self):
        if self.model is not None:
            return self.model
        from rest_framework.authtoken.models import Token
        return Token

    """
    A custom token model may be used, but must have the following properties.

    * key -- The string identifying the token
    * user -- The user to which the token belongs
    """

    def authenticate(self, request):
        auth = get_authorization_header(request).split()

        if not auth or auth[0].lower() != self.keyword.lower().encode():
            return None

        if len(auth) !=2:
            raise exceptions.AuthenticationFailed("認(rèn)證異常!")

        # jwt解碼
        try:
            jwt_token = auth[1]
            jwt_info = jwt.decode(jwt_token, settings.SECRET_KEY,'HS256')

            # 獲取userid
            userid = jwt_info.get("userid")

            # 查詢用戶是否存在
            try:
                user = User.objects.get(pk=userid)
                return user, jwt_token
            except Exception:
                raise exceptions.AuthenticationFailed("用戶不存在")
        except jwt.ExpiredSignatureError:
            raise exceptions.AuthenticationFailed("抱歉,該token已過期!")

最后,在視圖集 ViewSet 中,只需要在屬性「 authentication_classes 」中指定認(rèn)證列表即可

from rest_framework import viewsets
from .models import *
from .serializers import *
from .authentications import *

class GoodsViewSet(viewsets.ModelViewSet):
    # 所有商品數(shù)據(jù)
    queryset = Goods.objects.all()

    # 序列化
    serializer_class = GoodsSerializer

    # JWT授權(quán)
    authentication_classes = [JWTAuthentication]

4. 最后

在實際項目中,一般在登錄的時候生成 JWT Token,后續(xù)接口中只需要在請求頭中設(shè)置 JWT Token 即可正常返回數(shù)據(jù)

import requests

url = "***.***.****"

payload={}
headers = {
  'AUTHORIZATION': 'jwt eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyaWQiOiJVTmJCRTJTRlNndm5DU0c3amdQZGJVIiwiZXhwIjoxNjI2MDk5NDA5fQ.cxXsRulEWWQotNpb7XwlZbISrrpb7rSRCjkLsyb8WDM'
}

response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8254

    瀏覽量

    149945
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6713

    瀏覽量

    88303
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1461

    瀏覽量

    61489
  • 虛擬環(huán)境
    +關(guān)注

    關(guān)注

    0

    文章

    27

    瀏覽量

    8914
收藏 人收藏

    評論

    相關(guān)推薦

    Protal wifidog的認(rèn)證流程

    服務(wù)器的portal接口,附帶參數(shù)gw_id viii. 認(rèn)證服務(wù)器的的portal接口根據(jù)業(yè)務(wù)流成顯示廣告業(yè)或者做其他的跳轉(zhuǎn) ix. 整個認(rèn)證流程
    發(fā)表于 07-24 08:10

    沙特SABER認(rèn)證操作流程

    沙特沙特SABER認(rèn)證分PC(產(chǎn)品證書認(rèn)證)和SC(驗貨證書)兩部分,其中PC證書一年有效,一年內(nèi)部需要重復(fù)去做,SC證書針對當(dāng)票貨物,每次出貨都需要重新申請,以下是操作流程,希望對大
    發(fā)表于 12-18 15:30

    IPD流程操作細(xì)則

    IPD流程操作細(xì)則:IPD流程操作細(xì)則IPD流程操作指引--立項階段工作
    發(fā)表于 05-07 23:00 ?101次下載

    數(shù)字后端設(shè)計流程

    數(shù)字后端流程 1. 數(shù)據(jù)準(zhǔn)備。對于 CDN 的 Silicon Ensemble而言后端設(shè)計所需的數(shù)據(jù)主要有是Foundry廠提供的標(biāo)準(zhǔn)單元、宏單元和I/O Pad的庫文件,它包括物理庫、時序庫及網(wǎng)表庫,分別以.lef、
    發(fā)表于 10-28 10:31 ?40次下載

    IC設(shè)計前后端流程與EDA工具介紹

    本文首先介紹了ic設(shè)計的方法,其次介紹了IC設(shè)計前段設(shè)計的主要流程及工具,最后介紹了IC設(shè)計后端設(shè)計的主要流程及工具。
    發(fā)表于 04-19 18:04 ?1.2w次閱讀

    如何才能保證JWT安全

    jwt是什么? JWTs是JSON對象的編碼表示。JSON對象由零或多個名稱/值對組成,其中名稱為字符串,值為任意JSON值。JWT有助于在clear(例如在URL中)發(fā)送這樣的信息,可以被信任
    的頭像 發(fā)表于 09-29 15:09 ?3214次閱讀

    MicroProfile JWT Auth MicroProfile的JWT RBAC規(guī)范

    microprofile-jwt-auth.zip
    發(fā)表于 05-07 10:04 ?0次下載
    MicroProfile <b class='flag-5'>JWT</b> Auth MicroProfile的<b class='flag-5'>JWT</b> RBAC規(guī)范

    jwt-auth基于ThinkPHP的jwt框架

    ./oschina_soft/gitee-jwt-auth.zip
    發(fā)表于 06-30 09:10 ?1次下載
    <b class='flag-5'>jwt</b>-auth基于ThinkPHP的<b class='flag-5'>jwt</b>框架

    SpringBoot 后端接口規(guī)范(上)

    一個后端接口大致分為四個部分組成: 接口地址(url)、接口請求方式(get、post等)、請求數(shù)據(jù)(request)、響應(yīng)數(shù)據(jù)(response) 。雖然說后端接口的編寫并沒有統(tǒng)一規(guī)
    的頭像 發(fā)表于 05-05 17:00 ?680次閱讀
    SpringBoot <b class='flag-5'>后端接口</b>規(guī)范(上)

    SpringBoot 后端接口規(guī)范(中)

    一個后端接口大致分為四個部分組成: 接口地址(url)、接口請求方式(get、post等)、請求數(shù)據(jù)(request)、響應(yīng)數(shù)據(jù)(response) 。雖然說后端接口的編寫并沒有統(tǒng)一規(guī)
    的頭像 發(fā)表于 05-05 17:01 ?573次閱讀
    SpringBoot <b class='flag-5'>后端接口</b>規(guī)范(中)

    SpringBoot 后端接口規(guī)范(下)

    一個后端接口大致分為四個部分組成:接口地址(url)、接口請求方式(get、post等)、請求數(shù)據(jù)(request)、響應(yīng)數(shù)據(jù)(response)。雖然說后端接口的編寫并沒有統(tǒng)一規(guī)范要
    的頭像 發(fā)表于 05-05 17:02 ?553次閱讀

    ic設(shè)計前端到后端流程 ic設(shè)計的前端和后端的區(qū)別

    IC(Integrated Circuit)設(shè)計涉及兩個主要的階段:前端設(shè)計和后端設(shè)計。它們在IC設(shè)計流程中扮演著不同的角色和職責(zé),具有以下區(qū)別
    的頭像 發(fā)表于 08-15 14:49 ?3852次閱讀

    JWT認(rèn)證流程

    今天帶大家來認(rèn)識一下JWT。 JWT簡介 JWT(Json Web Token)是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于 Json 的開放標(biāo)準(zhǔn)。JWT 的聲明一般被用來在身份提供
    的頭像 發(fā)表于 10-08 15:01 ?1045次閱讀
    <b class='flag-5'>JWT</b>的<b class='flag-5'>認(rèn)證</b><b class='flag-5'>流程</b>

    springboot前后端交互流程

    Boot 進行開發(fā)時,前后端交互是一個非常重要的部分,本文將詳細(xì)介紹 Spring Boot 前后端交互的流程。 前后端交互的基本原理 在前后端
    的頭像 發(fā)表于 11-22 16:00 ?1672次閱讀

    什么是JWTJWT由哪些部分組成?JWT如何進行用戶認(rèn)證?

    JWT(JSON Web Token)是一個開放的行業(yè)標(biāo)準(zhǔn)(RFC 7519),自身包含了身份驗證所需要的所有信息,因此我們的服務(wù)器不需要存儲用戶Session信息。
    的頭像 發(fā)表于 02-25 09:44 ?2548次閱讀
    什么是<b class='flag-5'>JWT</b>?<b class='flag-5'>JWT</b>由哪些部分組成?<b class='flag-5'>JWT</b>如何進行用戶<b class='flag-5'>認(rèn)證</b>?