iT邦幫忙

0

伸縮自如的Flask [day4] JWT

好的,你很辛苦的寫了很多API function,但是你卻不希望閒雜人等沒事就call一下你的API功能。
也許,你該試試JWT了。JWT的主要功能是進行驗證、授權、資訊交換,你也可以搜尋一下JWT介紹以及他與session之間的比較。

https://github.com/wilsonsujames/jwt_test/blob/main/app.py

pip install Flask-JWT-Extended
from flask_jwt_extended import create_access_token, jwt_required,set_access_cookies,unset_jwt_cookies,JWTManager
from flask import Flask,render_template,jsonify, request
import os

jwt = JWTManager()

app = Flask(__name__)
jwt.init_app(app)
app.config['JWT_SECRET_KEY'] = os.urandom(24)
app.config['JWT_TOKEN_LOCATION'] = ['headers','query_string']
app.config['JWT_BLACKLIST_ENABLED'] = True
app.config['JWT_BLACKLIST_TOKEN_CHECKS'] = ['access']

@app.route('/')
def index():
    
    AccountName=request.form.get('AccountName')
    access_token = create_access_token(identity=AccountName)
    
    return jsonify({'login_status':'seccess','jwt':access_token})

@app.route('/helloJwt')
@jwt_required()
def jwtTest():
    return 'jwt test success.'


if __name__ == "__main__":
    app.run(debug=True,threaded=True,port=8888)    

好的,來到程式碼來看最基本的運用,執行程式到根路由,你可以用postman也可以用requests套件來夾帶JWT call api,但是我們這裡使用更簡單的方式,直接在瀏覽器上貼上:
http://127.0.0.1:5000/helloJwt?jwt= + 你從根路由獲得的JWT

沒錯,大概就是長成這樣:
http://127.0.0.1:5000/helloJwt?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcmVzaCI6ZmFsc2UsImlhdCI6MTYyMDY0ODIzMywianRpIjoiNTBkZDMwNTEtYTRmMS00Yjc0LTk4Y2YtYmI4OGI2MjlmOGFhIiwidHlwZSI6ImFjY2VzcyIsInN1YiI6bnVsbCwibmJmIjoxNjIwNjQ4MjMzLCJleHAiOjE2MjA2NDkxMzN9.4ttjiD7sDh5PRtg6PvAcDdhJy3dLJCA1ghCVBYhydr0

只是我的JWT跟你的長得不一樣而已,好的現在你能讓只有知道JWT的人,才能使用jwtTest這個function了。
但是假設你想要夾帶附加資訊呢?
https://flask-jwt-extended.readthedocs.io/en/stable/add_custom_data_claims/

additional_claims = {"aud": "some_audience", "foo": "bar"}
access_token = create_access_token(username, additional_claims=additional_claims)

可以發現在additional_claims的參數我們夾帶了額外資訊。

@app.route("/protected", methods=["GET"])
@jwt_required()
def protected():
    claims = get_jwt()
    return jsonify(foo=claims["foo"])

在jwt_required的路由藉由get_jwt()來獲取額外資訊。

注意
未來的API如果為POST的方法:

@member_blueprint.route('/member_login', methods=["POST"])

請乖乖地使用requests或是postman,來順利地call api。

第四天就到這裡吧,剛好九點了。


尚未有邦友留言

立即登入留言