2022/1/25

bearer auth in swagger-py-codegen, implemented with flask_jwt_extended

想要做的是 : RESTful 使用 bearer (jwt)。
用 swagger-py-codegen 產生 flask control code.
然後用 flask-jwt-extended 來完成需要的bearer function.

完成的 project 在 openapi.yaml 開始。
swagger-py-codegen --swagger-doc openapi.yaml example --ui --spec
產生 python code
browser 開啟http://localhost:5000/static/swagger-ui/index.html 就可以用 swagger 測試 flask server code

大概就是:
flask_jwt_extended 自己會處理 global , static 變數問題。
所以可以在任意module import, call create_access_token, jwt_required() .. 等。 只要確定在使用前,app 啟動時 call JWTManager() 初始化,和 設定 ['JWT_SECURITY_KEY']
diff --git a/example/example/__init__.py b/example/example/__init__.py
index fe02a18..ccf02a9 100644
--- a/example/example/__init__.py
+++ b/example/example/__init__.py
@@ -2,16 +2,21 @@
 from __future__ import absolute_import

 from flask import Flask
+from flask_jwt_extended import JWTManager

 import v1

 def create_app():
     app = Flask(__name__, static_folder='static')
     app.register_blueprint(
         v1.bp,
         url_prefix='/v1')
+    app.config["JWT_SECRET_KEY"] = "mysecret"
+    JWTManager(app)
     return app

另外,codegen 預計在 scopes[] 實做 security,因為不知道怎嘛用,所以只好把 schemas.py 中,scopes = { } 的內容刪除,讓 scope 是空 dictionary
否則有yaml 中有 security 的 path。一律回 permission deny
diff --git a/example/example/v1/schemas.py b/example/example/v1/schemas.py
index 4b20894..7e54c7c 100644
--- a/example/example/v1/schemas.py
+++ b/example/example/v1/schemas.py
@@ -61,7 +61,6 @@ filters = {
 }

 scopes = {
-    ('protect', 'GET'): ['secret'],
 }

 resolver = RefResolver.from_schema(definitions)
@@ -228,4 +227,4 @@ def normalize(schema, data, required_defaults=None, resolver=None):

         return funcs[type_](schema, data)

還有就是..用 postman 測試都 OK,用 swagger-ui 卻都是 fail,開啟 chrome debugger panel,可以看到 fail 的內容是 CORS。
diff --git a/example/example/__init__.py b/example/example/__init__.py
index fe02a18..ccf02a9 100644
--- a/example/example/__init__.py
+++ b/example/example/__init__.py
@@ -2,16 +2,21 @@
 from __future__ import absolute_import

 from flask import Flask
+from flask_cors import CORS

 import v1


 def create_app():
     app = Flask(__name__, static_folder='static')
+    CORS(app)



另外,flask 官方有範例,使用 jwt package,不用 flask_jwt_extened 來做的方法: 也是一樣,做一個 decorator @token_required.

沒有留言:

張貼留言