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),??#?過(guò)期時(shí)間:1天

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

????}

????#?生成token

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

????return?token

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

token?=?create_token(123)

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

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

驗(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已過(guò)期!"

    except jwt.InvalidTokenError:

        return "無(wú)效的Token!"

# 測(cè)試驗(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

下面是一個(gè)使用Flask框架的簡(jiǎn)單示例:

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無(wú)效!'}),?401

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

????return?decorated

#?登錄接口

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

def?login():

????#?這里簡(jiǎn)化了登錄邏輯

????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':?'你成功訪問(wèn)了受保護(hù)的接口!'})

注意事項(xiàng)

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

實(shí)用小技巧

自定義載荷

#?添加更多自定義信息

payload?=?{

????'user_id':?user_id,

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

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

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

}

不同的加密算法

PyJWT支持多種加密算法:

#?使用RS256算法(非對(duì)稱(chēng)加密)

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

練習(xí)題

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

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

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

上一篇:

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

下一篇:

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

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

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

查看全部API→
??

熱門(mén)場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

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

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

#AI深度推理大模型API

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

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