import?datetime

#?定義密鑰

SECRET_KEY?=?"your-secret-key"

#?創(chuàng)建token

def?create_token(user_id):

????#?設(shè)置token的有效載荷

????payload?=?{

????????'user_id':?user_id,

????????'exp':?datetime.datetime.utcnow()?+?datetime.timedelta(days=1),??#?過期時間:1天

????????'iat':?datetime.datetime.utcnow()??#?發(fā)行時間

????}

????#?生成token

????token?=?jwt.encode(payload,?SECRET_KEY,?algorithm='HS256')

????return?token

#?測試創(chuàng)建token

token?=?create_token(123)

print("生成的token:",?token)

小貼士SECRET_KEY要保管好哦!它就像是你的保險箱密碼,千萬不能泄露。

驗(yàn)證JWT Token

有了token,當(dāng)然要驗(yàn)證它是否有效:
def verify_token(token):

    try:

        # 驗(yàn)證token

        payload = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])

        return payload

    except jwt.ExpiredSignatureError:

        return "Token已過期!"

    except jwt.InvalidTokenError:

        return "無效的Token!"

# 測試驗(yàn)證token

try:

    result = verify_token(token)

    print("解碼后的數(shù)據(jù):", result)

except Exception as e:

    print("驗(yàn)證失敗:", str(e))

在Web應(yīng)用中使用JWT

下面是一個使用Flask框架的簡單示例:

from?flask?import?Flask,?jsonify,?request

from?functools?import?wraps

app?=?Flask(__name__)

#?驗(yàn)證token的裝飾器

def?token_required(f):

????@wraps(f)

????def?decorated(*args,?**kwargs):

????????token?=?request.headers.get('Authorization')

????????if?not?token:

????????????return?jsonify({'message':?'缺少token!'}),?401

????????try:

????????????payload?=?verify_token(token)

????????????request.user?=?payload

????????except:

????????????return?jsonify({'message':?'token無效!'}),?401

????????return?f(*args,?**kwargs)

????return?decorated

#?登錄接口

@app.route('/login',?methods=['POST'])

def?login():

????#?這里簡化了登錄邏輯

????user_id?=?123

????token?=?create_token(user_id)

????return?jsonify({'token':?token})

#?需要驗(yàn)證token的接口

@app.route('/protected')

@token_required

def?protected():

????return?jsonify({'message':?'你成功訪問了受保護(hù)的接口!'})

注意事項(xiàng)

  1. token一般放在請求頭的Authorization字段中
  2. 生產(chǎn)環(huán)境中要使用更安全的密鑰
  3. 根據(jù)需求設(shè)置合適的token過期時間

實(shí)用小技巧

自定義載荷

#?添加更多自定義信息

payload?=?{

????'user_id':?user_id,

????'username':?'python_lover',

????'role':?'admin',

????'exp':?datetime.datetime.utcnow()?+?datetime.timedelta(days=1)

}

不同的加密算法

PyJWT支持多種加密算法:

#?使用RS256算法(非對稱加密)

token?=?jwt.encode(payload,?private_key,?algorithm='RS256')

練習(xí)題

  1. 嘗試創(chuàng)建一個包含用戶角色信息的token
  2. 實(shí)現(xiàn)一個token刷新的功能
  3. 給token添加自定義的過期時間

小伙伴們,今天的Python學(xué)習(xí)之旅就到這里啦!記得動手敲代碼,有問題隨時在評論區(qū)留言哦。JWT的使用場景非常廣泛,掌握了它,你就離成為后端高手更近一步啦!祝大家學(xué)習(xí)愉快,Python學(xué)習(xí)節(jié)節(jié)高!

文章轉(zhuǎn)自微信公眾號@黑發(fā)工程

上一篇:

云原生 API 網(wǎng)關(guān) APISIX 入門教程

下一篇:

API接口安全性設(shè)計,項(xiàng)目中該如何保證API接口安全?
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊

多API并行試用

數(shù)據(jù)驅(qū)動選型,提升決策效率

查看全部API→
??

熱門場景實(shí)測,選對API

#AI文本生成大模型API

對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個渠道
一鍵對比試用API 限時免費(fèi)

#AI深度推理大模型API

對比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費(fèi)