衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

后端JWT接口認證的操作流程

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

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

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

2. JWT 介紹

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

數據結構由 3 部分組成,中間由「 **. ** 」分割開

它們分別是:

  • Header 頭部
  • Payload 負載
  • Signature 簽名
# JWT 數據的格式
# 組成方式:頭部.負載.簽名
Header.Payload.Signature

其中

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

Payload 用于設置需要傳遞的數據,包含:iss 簽發人、exp 過期時間、iat 簽發時間等

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

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

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

3. 實戰一下

首先,在虛擬環境中安裝 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:
    """
    # 設置token的過期時間戳
    # 比如:設置7天過期
    timestamp = int(time.time()) + 60 * 60 * 24 * 7

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

接著,編寫一個認證類

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

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):
    """自定義認證類"""

    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("認證異常!")

        # 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 」中指定認證列表即可

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

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

    # 序列化
    serializer_class = GoodsSerializer

    # JWT授權
    authentication_classes = [JWTAuthentication]

4. 最后

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

import requests

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

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

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

    關注

    33

    文章

    8694

    瀏覽量

    151924
  • 數據
    +關注

    關注

    8

    文章

    7145

    瀏覽量

    89582
  • API
    API
    +關注

    關注

    2

    文章

    1511

    瀏覽量

    62400
  • 虛擬環境
    +關注

    關注

    0

    文章

    28

    瀏覽量

    8973
收藏 人收藏

    評論

    相關推薦

    Protal wifidog的認證流程

    服務器的portal接口,附帶參數gw_id viii. 認證服務器的的portal接口根據業務流成顯示廣告業或者做其他的跳轉 ix. 整個認證流程
    發表于 07-24 08:10

    沙特SABER認證操作流程

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

    IPD流程操作細則

    IPD流程操作細則:IPD流程操作細則IPD流程操作指引--立項階段工作
    發表于 05-07 23:00 ?102次下載

    數字后端設計流程

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

    IC設計前后端流程與EDA工具介紹

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

    如何才能保證JWT安全

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

    MicroProfile JWT Auth MicroProfile的JWT RBAC規范

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

    jwt-auth基于ThinkPHP的jwt框架

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

    SpringBoot 后端接口規范(上)

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

    SpringBoot 后端接口規范(中)

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

    SpringBoot 后端接口規范(下)

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

    ic設計前端到后端流程 ic設計的前端和后端的區別

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

    JWT認證流程

    今天帶大家來認識一下JWTJWT簡介 JWT(Json Web Token)是為了在網絡應用環境間傳遞聲明而執行的一種基于 Json 的開放標準。JWT 的聲明一般被用來在身份提供
    的頭像 發表于 10-08 15:01 ?1350次閱讀
    <b class='flag-5'>JWT</b>的<b class='flag-5'>認證</b><b class='flag-5'>流程</b>

    springboot前后端交互流程

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

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

    JWT(JSON Web Token)是一個開放的行業標準(RFC 7519),自身包含了身份驗證所需要的所有信息,因此我們的服務器不需要存儲用戶Session信息。
    的頭像 發表于 02-25 09:44 ?3952次閱讀
    什么是<b class='flag-5'>JWT</b>?<b class='flag-5'>JWT</b>由哪些部分組成?<b class='flag-5'>JWT</b>如何進行用戶<b class='flag-5'>認證</b>?
    娱乐城免费送体验金| 大发888官方 46| 百家乐有没有攻略| 真人百家乐官网蓝盾娱乐网| 海滨湾国际娱乐城| 江西老虎机遥控器| 定做百家乐桌子| 百家乐官网游戏机图片| 轮盘| 大发888网页版出纳| 网上百家乐返水| 百家乐作弊视频| 网上百家乐官网是真是假天涯论坛| 百家乐官网庄闲比率| 大发888唯一官网| 五张百家乐的玩法技巧和规则| 百家乐视频麻将下载| 黄金城百家乐官网安卓版| 百家乐官网英皇娱乐城| 百家乐官网破解之法| 伟博娱乐城| 大玩家百家乐的玩法技巧和规则| 澳门百家乐怎么赢钱| 养狗对做生意风水好吗| 百家乐官网娱乐网代理佣金| 澳门百家乐官网在线| 百家乐官网稳赚打法| 网上澳门| 大发888官网多少| 百家乐长t恤| 百家乐小揽| 百家乐游戏分析| 华人百家乐官网博彩论| 百家乐官网羸钱法| 百家乐官网金海岸软件| 百家乐官网视频麻将下载| 在线百家乐官网代理| 菲律宾在线游戏| 网上棋牌游戏赚钱| 大发888在线娱乐城合作伙伴| 贵族百家乐的玩法技巧和规则 |