成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

FastAPI 自動(dòng)續(xù)簽 Token 與刷新機(jī)制詳解:讓用戶登錄更持久!

開發(fā)
Refresh Token 是一種用于刷新 Access Token 的憑證。它不用于訪問受保護(hù)資源,只用于生成新的 Access Token。

在 Web 應(yīng)用中,JWT(JSON Web Token)常用于身份認(rèn)證。但 JWT 通常有固定的過期時(shí)間,一旦過期就會(huì)導(dǎo)致用戶強(qiáng)制重新登錄 —— 這顯然影響體驗(yàn)。

解決方案?

引入 Refresh Token(刷新令牌)機(jī)制,實(shí)現(xiàn) Access Token 的自動(dòng)續(xù)簽!

一句話理解 Refresh Token

Refresh Token 是一種用于刷新 Access Token 的憑證。 它不用于訪問受保護(hù)資源,只用于生成新的 Access Token。

整體流程圖

登錄成功后返回:
├── access_token(短期有效) → 用于訪問接口  
└── refresh_token(長(zhǎng)期有效) → 用于刷新 access_token

?? 客戶端邏輯:
1. 每次請(qǐng)求攜帶 access_token
2. 如果接口返回 401(token 過期):
   - 使用 refresh_token 請(qǐng)求刷新接口,換一個(gè)新的 access_token
   - 自動(dòng)重試原請(qǐng)求

數(shù)據(jù)模型設(shè)計(jì)

新增 refresh_token 存儲(chǔ)字段(也可以存 Redis 中)。

models/user.py 示例: from tortoise import fields, models

from tortoise import fields, models

class User(models.Model):
    id = fields.IntField(pk=True)
    username = fields.CharField(max_length=50, unique=True)
    hashed_password = fields.CharField(max_length=128)
    refresh_token = fields.CharField(max_length=512, null=True)  # 新增

JWT 工具函數(shù)封裝(包含 refresh 支持)

from jose import jwt
from datetime import datetime, timedelta

SECRET_KEY = "your-access-token-secret"
REFRESH_SECRET = "your-refresh-token-secret"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 15
REFRESH_TOKEN_EXPIRE_DAYS = 7

def create_access_token(data: dict, expires_delta: timedelta = None):
    to_encode = data.copy()
    expire = datetime.utcnow() + (expires_delta or timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES))
    to_encode.update({"exp": expire})
    return jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)

def create_refresh_token(data: dict):
    expire = datetime.utcnow() + timedelta(days=REFRESH_TOKEN_EXPIRE_DAYS)
    to_encode = data.copy()
    to_encode.update({"exp": expire})
    return jwt.encode(to_encode, REFRESH_SECRET, algorithm=ALGORITHM)

def verify_refresh_token(token: str):
    try:
        payload = jwt.decode(token, REFRESH_SECRET, algorithms=[ALGORITHM])
        return payload
    except Exception:
        return None

登錄接口返回雙 token

@router.post("/login")
async def login(user: UserLoginSchema):
    user_obj = await authenticate(user.username, user.password)
    if not user_obj:
        raise HTTPException(status_code=401, detail="賬號(hào)或密碼錯(cuò)誤")

    data = {"sub": user_obj.username, "uid": user_obj.id}
    access_token = create_access_token(data)
    refresh_token = create_refresh_token(data)

    # 保存 refresh_token 到數(shù)據(jù)庫
    user_obj.refresh_token = refresh_token
    await user_obj.save()

    return {
        "access_token": access_token,
        "refresh_token": refresh_token,
        "token_type": "bearer"
    }

提供刷新接口 /refresh

@router.post("/refresh")
async def refresh_token(refresh_token: str = Body(...)):
    payload = verify_refresh_token(refresh_token)
    if not payload:
        raise HTTPException(status_code=401, detail="Refresh token 失效")

    # 確認(rèn)數(shù)據(jù)庫中 refresh_token 是否匹配(防止偽造)
    user = await User.get(id=payload["uid"])
    if user.refresh_token != refresh_token:
        raise HTTPException(status_code=401, detail="Refresh token 不合法")

    new_token = create_access_token({"sub": user.username, "uid": user.id})
    return {"access_token": new_token, "token_type": "bearer"}

小結(jié)

結(jié)合兩個(gè) token,我們實(shí)現(xiàn)了:

  • 安全性:短時(shí) Access Token 暴露后影響有限
  • 易用性:Refresh Token 自動(dòng)續(xù)期,無需頻繁登錄
責(zé)任編輯:趙寧寧 來源: Ssoul肥魚
相關(guān)推薦

2011-07-15 09:57:03

MongoDB緩存刷新

2021-12-08 06:53:28

Choreograph屏幕機(jī)制

2021-04-21 07:53:13

Android屏幕刷新

2020-10-13 08:36:30

React 架構(gòu)機(jī)制

2010-09-06 08:43:13

.NET 4

2021-09-27 06:29:01

Redis淘汰機(jī)制

2012-05-02 14:41:04

jQuery

2025-06-23 04:00:00

接口SpringToken

2020-09-21 14:35:20

VuenextTick前端

2010-03-10 11:55:30

Mocha BSM運(yùn)維管理摩卡軟件

2024-01-03 21:50:32

緩存機(jī)制請(qǐng)求

2025-04-25 08:30:00

前端后端用戶登錄

2024-09-06 17:49:46

2016-03-17 10:20:57

2010-06-02 11:33:26

Linux 內(nèi)存監(jiān)控

2025-06-05 02:22:00

2024-09-02 10:46:57

2021-12-06 14:33:32

自動(dòng)駕駛冬奧會(huì)安全

2022-09-08 11:33:47

token釘釘打卡小工具

2011-04-28 16:29:11

投影機(jī)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲精品国产一区 | 99国内精品久久久久久久 | 亚洲免费视频一区二区 | 精品区| 日韩欧美在线免费 | 久久精品 | 午夜天堂精品久久久久 | 青青草网站在线观看 | 成人免费视频播放 | 国产一区二区 | 欧洲精品视频一区 | 日韩欧美国产一区二区三区 | 欧美天堂在线 | 色婷婷综合久久久中字幕精品久久 | 久久久123 | 亚洲不卡在线观看 | av中文字幕在线 | 久久久国产一区二区三区四区小说 | dy天堂| 久久精品99 | 国产精品久久久久婷婷二区次 | 久久久久久99 | www.中文字幕.com | aⅴ色国产 欧美 | 一道本不卡 | 老司机67194精品线观看 | 国精产品一区一区三区免费完 | 九九久久免费视频 | 中文字幕在线观看一区二区 | 亚洲视频一区在线 | 免费一区二区三区 | 日本精品一区二区三区视频 | 日日日干干干 | 国产精品成人免费 | 超碰导航 | 精精国产xxxx视频在线播放7 | 欧美一区二区 | 欧美日韩福利 | 欧美aⅴ在线观看 | 午夜一区二区三区在线观看 | xxxxx黄色片|