我有一个情节短划线应用程序,我想把它放在一条受 JWT 保护的路线后面。我的最终目标是将其包含在单独路由上的 iframe 中,但我只希望用户能够在他们有访问令牌的情况下获取破折号应用程序的 html。
我已经在获取请求中重新尝试返回应用程序本身。
App.py
import dash
from flask import Flask, jsonify, request
from flask_jwt_extended import (
JWTManager, jwt_required, create_access_token,
get_jwt_identity
)
server = Flask(__name__)
server.config['JWT_SECRET_KEY'] = 'super-secret' # Change this!
jwt = JWTManager(server)
@server.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
access_token = create_access_token(identity=username)
return jsonify(access_token=access_token), 200
@server.route('/')
@jwt_required
def index():
return 'Hello world flask app'
app = dash.Dash(
__name__,
server=server,
routes_pathname_prefix='/'
)
app.config.suppress_callback_exceptions = True
Index.py
from app import app
import dash_html_components as html
import dash_core_components as dcc
from dash.dependencies import Input, Output
from combination_1 import Combination
import callbacks
app.layout = html.Div([
dcc.Location(id='url', refresh=False),
html.Div(id="root_div")
])
@app.callback(
Output('root_div', 'children'),
[Input('url', 'pathname')]
)
def attatch_graphs(pathname):
return Combination(comb_id='comb_1').return_div()
if __name__ == '__main__':
app.run_server()
我将分享一些我发现的研究这个问题的资源:
- 达世币提供了一个名为
dash-auth
的库,您可以使用pip install dash-auth
- 安装库后,您将能够使用
import dash_auth
,并且您会注意到 HTTP Basic Auth、OAuth 和 ">PlotlyAuth" 的子模块。 "PlotlyAuth"已被弃用,根据from dash_auth.plotly_auth import deprecation_notice
中的文本 - 此模块的源代码似乎 https://github.com/plotly/dash-auth
- 文档可在 https://dash.plotly.com/authentication 获得,促销页面可在 https://plotly.com/dash/authentication/
- 据推测,JWT可以使用Flask的
Response.set_cookie
进行集成。 以下是有关该方法的详细信息,请注意作者使用了rep.set_cookie('custom-auth-session', username)
- Github上有一个使用Dash,Flask和Flask-Login的例子。 此配置也存在于单独的 StackOverflow 问题中。 但是,此库不支持 JWT。 您可以使用 Flask-JWT-Extended 库实现类似的体系结构。