好的,你很辛苦的寫了很多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
只是我的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。
第四天就到這裡吧,剛好九點了。