用故事的講述 JWT

用講故事的方法講述 JWT

JWT 就像一張門禁卡

小明管理著一個小區(qū)的物業(yè),負責整個小區(qū)的出入安全。剛開始的時候小明決定要保險一點,所有出入小區(qū)的都要驗證業(yè)主的本人信息。

所以他搞了個規(guī)定,每個進小區(qū)的人都要驗證身份證和指紋,通過后臺證明你是業(yè)主才讓你進去。剛開始的時候這個規(guī)定還行,但是隨著小區(qū)的出入人員變多,處理速度太慢,小區(qū)業(yè)主經(jīng)常需要排隊進入小區(qū)。

收到了大量的投訴電話只后小明決定反思一下,決定使用門禁卡來解決這個效率問題。他于是讓業(yè)主去物業(yè)做一個一次性的身份驗證,通過了之后就發(fā)一張門禁卡給業(yè)主,不過門禁卡有期限限制,半年之后就需要更新一下,而且業(yè)主刷卡的時候,物業(yè)只需要驗證下這是不是我們發(fā)的業(yè)主卡就行了。

物業(yè)在處理門禁卡信息的時候,會從門禁卡里面解密信息,那個信息里面帶有業(yè)主自己本人的信息。

在這個故事里面,

  • 第一個的每次進入小區(qū)都需要驗證就是傳統(tǒng)的session登錄方法
  • 門禁卡制度就是jwt

用python實踐 JWT

使用JWT實踐的方法很簡單,就是分三部分。

  • 服務器驗證是否是用戶
  • 服務器為用戶生成一個TOKEN
  • 用戶訪問服務器的時候帶著那個TOKEN
  • 服務驗證TOKEN是否合法
  • 用戶訪問內容

完整的例子

from flask import Flask, jsonify, request
from flask_jwt_extended import (
    JWTManager, jwt_required, create_access_token,
    get_jwt_identity
)

app = Flask(__name__)

# Setup the Flask-JWT-Extended extension
app.config['JWT_SECRET_KEY'] = 'super-secret'  # Change this!
jwt = JWTManager(app)


# Provide a method to create access tokens. The create_access_token()
# function is used to actually generate the token, and you can return
# it to the caller however you choose.
@app.route('/login', methods=['POST'])
def login():
    if not request.is_json:
        return jsonify({"msg": "Missing JSON in request"}), 400

    username = request.json.get('username', None)
    password = request.json.get('password', None)
    if not username:
        return jsonify({"msg": "Missing username parameter"}), 400
    if not password:
        return jsonify({"msg": "Missing password parameter"}), 400

    if username != 'test' or password != 'test':
        return jsonify({"msg": "Bad username or password"}), 401

    # Identity can be any data that is json serializable
    # 服務器為用戶生成一個TOKEN
    access_token = create_access_token(identity=username)
    return jsonify(access_token=access_token), 200


# Protect a view with jwt_required, which requires a valid access token
# in the request to access.
@app.route('/protected', methods=['GET'])
@jwt_required
def protected():
    # Access the identity of the current user with get_jwt_identity
    # 服務驗證TOKEN是否合法
    current_user = get_jwt_identity()
    # 用戶訪問內容
    return jsonify(logged_in_as=current_user), 200


if __name__ == '__main__':
    app.run()

運行該程序

  • 用戶如何獲得token
curl -H "Content-Type: application/json" -X POST \
  -d '{"username":"test","password":"test"}' http://localhost:5000/login

代碼會返回類似于

{"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmcmVzaCI6dHJ1ZSwianRpIjoiZjhmNDlmMjUtNTQ4OS00NmRjLTkyOWUtZTU2Y2QxOGZhNzRlIiwidXNlcl9jbGFpbXMiOnt9LCJuYmYiOjE0NzQ0NzQ3OTEsImlhdCI6MTQ3NDQ3NDc5MSwiaWRlbnRpdHkiOiJ0ZXN0IiwiZXhwIjoxNDc0NDc1NjkxLCJ0eXBlIjoiYWNjZXNzIn0.vCy0Sec61i9prcGIRRCbG8e9NV6_wFH2ICFgUGCLKpc"}

  • 用戶訪問的過程中帶上token
export ACCESS="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmcmVzaCI6dHJ1ZSwianRpIjoiZjhmNDlmMjUtNTQ4OS00NmRjLTkyOWUtZTU2Y2QxOGZhNzRlIiwidXNlcl9jbGFpbXMiOnt9LCJuYmYiOjE0NzQ0NzQ3OTEsImlhdCI6MTQ3NDQ3NDc5MSwiaWRlbnRpdHkiOiJ0ZXN0IiwiZXhwIjoxNDc0NDc1NjkxLCJ0eXBlIjoiYWNjZXNzIn0.vCy0Sec61i9prcGIRRCbG8e9NV6_wFH2ICFgUGCLKpc"

然后訪問接口

curl -H "Authorization: Bearer $ACCESS" http://localhost:5000/protected

最后返回

{
  "logged_in_as": "test"
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 各鎮(zhèn)人民政府,開發(fā)區(qū)、茅山旅游度假區(qū)管委會,東城街道辦事處,市各委辦局,市直各單位: 《金壇市物業(yè)管理辦法》已經(jīng)市...
    我愛灬我家閱讀 1,929評論 0 1
  • 首先聲明,我只是一個平時喜歡關注小區(qū)事關自身利益大小事、對南都物業(yè)服務不滿而拒絕交納物業(yè)費的普通業(yè)主,而非1、2、...
    cncity2017閱讀 1,704評論 0 2
  • 時間很快,快到我總感覺自己在虛度,沒有一點點成長的每天,讓我對未來充滿了膽怯。焦慮和不安占據(jù)我心理的大部分,連身體...
    木易大膽閱讀 180評論 0 0
  • 案例一~四:記憶撲克四組 總結: 撲克轉換數(shù)字還是有些慢了,連結的也不是特別緊密,jqk的轉換老是卡頓。 主要還是...
    文魁大腦彭文浩閱讀 161評論 0 1
  • 事物皆有兩面性,對錯也好,利弊也罷。至少看事物的方向不一樣了,味道也就變了。
    生活過敏閱讀 270評論 1 4

友情鏈接更多精彩內容