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

JWT?登錄鑒權(quán)全流程完整步驟

 更新時間:2026年01月23日 09:58:57   作者:Aerkui  
JWT是一種用于在各方之間安全傳輸信息的開放標(biāo)準(zhǔn),JWT的優(yōu)勢在于無狀態(tài)、分布式支持和簡單性,本文給大家介紹JWT登錄鑒權(quán)全流程,感興趣的朋友跟隨小編一起看看吧

一、什么是 JWT?

JWT(JSON Web Token) 是一種開放標(biāo)準(zhǔn)(RFC 7519),用于在各方之間安全地傳輸信息。它常被用作用戶登錄后的身份憑證(替代傳統(tǒng)的 Session)。

JWT 長什么樣?

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJ1c2VyX2lkIjoxMjMsImV4cCI6MTcwMDAwMDAwMH0.
HMACSHA256(base64UrlEncode(header)+'.'+base64UrlEncode(payload), secret)

由三部分組成,用 . 連接:

  1. Header(頭部):算法和類型
  2. Payload(載荷):用戶數(shù)據(jù) + 過期時間等
  3. Signature(簽名):防篡改的關(guān)鍵

二、JWT 登錄鑒權(quán)完整流程

?? 場景假設(shè)

  • 用戶:alice
  • 密碼:123456
  • 后端服務(wù):提供 /login 和受保護(hù)的 /profile 接口

? 步驟 1:用戶提交賬號密碼(登錄)

POST /login
Content-Type: application/json
{
  "username": "alice",
  "password": "123456"
}

?? 注意:密碼應(yīng)通過 HTTPS 傳輸!明文密碼絕不應(yīng)在日志或前端存儲。

? 步驟 2:服務(wù)端驗(yàn)證賬號密碼

# 偽代碼(Python + Flask)
from werkzeug.security import check_password_hash
@app.route('/login', methods=['POST'])
def login():
    data = request.json
    user = User.query.filter_by(username=data['username']).first()
    if not user or not check_password_hash(user.password_hash, data['password']):
        return jsonify({"error": "用戶名或密碼錯誤"}), 401
    # 驗(yàn)證通過,生成 JWT
    token = generate_jwt(user_id=user.id)
    return jsonify({"token": token})

?? 安全提示:

  • 密碼必須加鹽哈希存儲(如 bcrypt、scrypt)
  • 失敗時不要區(qū)分“用戶不存在”還是“密碼錯誤”,防止枚舉攻擊

? 步驟 3:服務(wù)端生成 JWT 并返回

import jwt
import datetime
def generate_jwt(user_id):
    payload = {
        'user_id': user_id,
        'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=2),  # 2小時過期
        'iat': datetime.datetime.utcnow()  # 簽發(fā)時間
    }
    secret = 'your_strong_secret_key'  # 必須保密!建議從環(huán)境變量讀取
    return jwt.encode(payload, secret, algorithm='HS256')

?? Payload 常見字段(Claims):

  • sub:主題(如用戶ID)
  • exp:過期時間(必須設(shè)置!
  • iat:簽發(fā)時間
  • jti:JWT ID(用于黑名單)

? 步驟 4:前端保存 Token

// 登錄成功后
localStorage.setItem('token', response.data.token);
// 后續(xù)請求攜帶 Token
fetch('/profile', {
  headers: {
    'Authorization': 'Bearer ' + localStorage.getItem('token')
  }
})

?? 存儲建議:

  • 短期 Token:可存 localStorage(注意 XSS 風(fēng)險)
  • 高安全場景:存 HttpOnly Cookie(防 XSS,但需防 CSRF)

? 步驟 5:訪問受保護(hù)接口(攜帶 Token)

GET /profile
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.xxxxx

? 步驟 6:服務(wù)端驗(yàn)證 JWT

@app.route('/profile')
def profile():
    auth_header = request.headers.get('Authorization')
    if not auth_header or not auth_header.startswith('Bearer '):
        return jsonify({"error": "缺少 Token"}), 401
    token = auth_header.split(' ')[1]
    try:
        payload = jwt.decode(token, 'your_strong_secret_key', algorithms=['HS256'])
        user_id = payload['user_id']
        user = User.query.get(user_id)
        return jsonify({"username": user.username})
    except jwt.ExpiredSignatureError:
        return jsonify({"error": "Token 已過期"}), 401
    except jwt.InvalidTokenError:
        return jsonify({"error": "無效 Token"}), 401

? 驗(yàn)證內(nèi)容:

  1. 簽名是否合法(防篡改)
  2. 是否過期(exp
  3. 用戶是否存在(防刪除賬號后仍能訪問)

三、JWT 的優(yōu)勢 vs 傳統(tǒng) Session

特性JWT(無狀態(tài))Session(有狀態(tài))
服務(wù)器存儲不需要存 Token需要存 Session(內(nèi)存/Redis)
擴(kuò)展性天然支持分布式需共享 Session 存儲
跨域支持簡單(Header 攜帶)復(fù)雜(需處理 Cookie 跨域)
登出控制困難(除非用黑名單)簡單(刪 Session 即可)

?? 結(jié)論

  • 小型項(xiàng)目、API 服務(wù) → 推薦 JWT
  • 需要強(qiáng)登出控制、高安全性 → 考慮 Session + Redis

四、安全加固建議(必看!)

1. 使用強(qiáng)密鑰

# .env
JWT_SECRET=your_very_long_random_string_32_chars_or_more!

2. 設(shè)置合理過期時間

  • Access Token:15分鐘 ~ 2小時
  • 刷新 Token(Refresh Token):7天(存數(shù)據(jù)庫,可吊銷)

3. 敏感操作二次驗(yàn)證

  • 修改密碼、支付等操作,即使有 Token 也要求重新輸密碼

4. 防止 Token 泄露

  • 前端避免打印 Token 到 console
  • 后端日志不要記錄 Authorization Header

5. 考慮使用 JTI + 黑名單(實(shí)現(xiàn)登出)

# 登出時將 jti 加入 Redis 黑名單(有效期 = token 剩余時間)
redis.setex(f"blacklist:{payload['jti']}", ttl, "1")
# 驗(yàn)證時檢查黑名單
if redis.get(f"blacklist:{payload['jti']}"):
    raise Exception("Token 已失效")

五、常見誤區(qū)

? 誤區(qū)1:JWT 是加密的
→ 錯!JWT 默認(rèn)是簽名(Signature),不是加密(Encryption)。Payload 可被 Base64 解碼!
? 敏感信息(如手機(jī)號)不要放 JWT!

? 誤區(qū)2:Token 越長越好
→ 過長的 Token 會增加網(wǎng)絡(luò)開銷,且可能被代理截斷

? 誤區(qū)3:用了 JWT 就絕對安全
→ 安全取決于整體設(shè)計:HTTPS、密鑰管理、輸入校驗(yàn)缺一不可

六、總結(jié):JWT 登錄鑒權(quán)核心要點(diǎn)

  1. 登錄 → 驗(yàn)證賬號密碼 → 生成帶過期時間的 JWT
  2. 請求 → 前端在 Header 中攜帶 Authorization: Bearer <token>
  3. 鑒權(quán) → 后端驗(yàn)證簽名 + 過期時間 + 用戶狀態(tài)
  4. 安全 → 強(qiáng)密鑰、短有效期、不存敏感信息、配合 HTTPS

?? 記住:JWT 是工具,不是銀彈。理解其原理,才能用得安全又高效。

附:快速上手資源

  • Python:PyJWT

到此這篇關(guān)于JWT 登錄鑒權(quán)全流程詳解的文章就介紹到這了,更多相關(guān)JWT 登錄鑒權(quán)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何運(yùn)行帶參數(shù)的python腳本

    如何運(yùn)行帶參數(shù)的python腳本

    這篇文章主要介紹了如何運(yùn)行帶參數(shù)的python腳本,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • python requests.get帶header

    python requests.get帶header

    這篇文章主要介紹了python requests.get帶heade方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編小編過來看看吧
    2020-05-05
  • Django choices下拉列表綁定實(shí)例

    Django choices下拉列表綁定實(shí)例

    這篇文章主要介紹了Django choices下拉列表綁定實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • 如何基于pandas讀取csv后合并兩個股票

    如何基于pandas讀取csv后合并兩個股票

    這篇文章主要介紹了如何基于pandas讀取csv后合并兩個股票,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • Python使用csv模塊進(jìn)行文件讀寫的操作詳解

    Python使用csv模塊進(jìn)行文件讀寫的操作詳解

    本文詳細(xì)介紹了CSV的基本概念、語法和核心特點(diǎn),通過實(shí)際案例講解了如何使用Python的csv模塊進(jìn)行數(shù)據(jù)讀取、分析、清洗、轉(zhuǎn)換、合并和拆分等操作,同時,還介紹了高級技巧、性能優(yōu)化方法和實(shí)戰(zhàn)工具的構(gòu)建,并提供了常見問題的解決方案及替代方案的選擇
    2026-05-05
  • Python Web框架Django的模型和數(shù)據(jù)庫遷移詳解

    Python Web框架Django的模型和數(shù)據(jù)庫遷移詳解

    Django 是一個極其強(qiáng)大的 Python Web 框架,它提供了許多工具和特性,能夠幫助我們更快速、更便捷地構(gòu)建 Web 應(yīng)用,在本文中,我們將會關(guān)注 Django 中的模型(Models)和數(shù)據(jù)庫遷移(Database Migrations)這兩個核心概念,需要的朋友可以參考下
    2023-08-08
  • python中文亂碼不著急,先看懂字節(jié)和字符

    python中文亂碼不著急,先看懂字節(jié)和字符

    這篇文章主要介紹了python中文亂碼不著急,先看懂字節(jié)和字符,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • Python開發(fā)中避免過度優(yōu)化的7種常見場景

    Python開發(fā)中避免過度優(yōu)化的7種常見場景

    今天我們來聊一個超火但又常常讓人“翻車”的話題:過度優(yōu)化,很多開發(fā)者,特別是剛接觸Python的朋友,往往會被“高級技巧”迷了眼,結(jié)果搞得自己程序既不簡潔,又不易維護(hù),那么,今天就來跟大家一起看看,Python開發(fā)中哪些“高級技巧”其實(shí)是過度優(yōu)化,應(yīng)該盡量避免的
    2025-05-05
  • Python?tkinter控件樣式詳解

    Python?tkinter控件樣式詳解

    tkinter對控件的諸多屬性提供了可定制的功能,下面以最常用的按鈕作為示例,集中展示其樣式特點(diǎn),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-09-09
  • python 制作本地應(yīng)用搜索工具

    python 制作本地應(yīng)用搜索工具

    這篇文章主要介紹了python 制作本地應(yīng)用搜索工具的方法,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-02-02

最新評論

星子县| 湟中县| 韶关市| 昌平区| 云和县| 宁津县| 商洛市| 温州市| 丰城市| 陆河县| 蚌埠市| 梁平县| 遂溪县| 桂林市| 岳普湖县| 奉节县| 英德市| 格尔木市| 辉南县| 榆林市| 芷江| 天气| 年辖:市辖区| 高台县| 方山县| 台北县| 临漳县| 井研县| 仁化县| 忻州市| 仪陇县| 四平市| 蓬溪县| 罗山县| 新干县| 睢宁县| 佛冈县| 景谷| 吉水县| 镇远县| 承德市|