簡體   English   中英

在 flask 應用程序工廠藍圖文件中使用 Azure AAD 的問題

[英]Issues using Azure AAD in flask application factory blueprint files

我正在嘗試使用 Flask 應用程序工廠模式來整理我的代碼庫。

我能夠在 Microsoft Here提供的單個文件中完成這項工作。

我了解 sqlalchemy 我正在 models.py 中創建 DB object,將其導入我的 init 文件,然后我可以在我的任何藍圖文件中導入和使用它。

我想通過 azure 身份驗證功能實現相同的目的。 目前我收到一個錯誤,因為在 azure 授權文件中,它不知道要設置它的“應用程序”是什么。

錯誤:

Traceback (most recent call last):
  File "C:\Program Files\Python310\lib\runpy.py", line 196, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "C:\Program Files\Python310\lib\runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "C:\Users\Ben\PycharmProjects\applicationfactoryeexamplke\venv\lib\site-packages\flask\__main__.py", line 3, in <module>
    main()
  File "C:\Users\Ben\PycharmProjects\applicationfactoryeexamplke\venv\lib\site-packages\flask\cli.py", line 1047, in main
    cli.main()
  File "C:\Users\Ben\PycharmProjects\applicationfactoryeexamplke\venv\lib\site-packages\click\core.py", line 1055, in main
    rv = self.invoke(ctx)
  File "C:\Users\Ben\PycharmProjects\applicationfactoryeexamplke\venv\lib\site-packages\click\core.py", line 1657, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "C:\Users\Ben\PycharmProjects\applicationfactoryeexamplke\venv\lib\site-packages\click\core.py", line 1404, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "C:\Users\Ben\PycharmProjects\applicationfactoryeexamplke\venv\lib\site-packages\click\core.py", line 760, in invoke
    return __callback(*args, **kwargs)
  File "C:\Users\Ben\PycharmProjects\applicationfactoryeexamplke\venv\lib\site-packages\click\decorators.py", line 84, in new_func
    return ctx.invoke(f, obj, *args, **kwargs)
  File "C:\Users\Ben\PycharmProjects\applicationfactoryeexamplke\venv\lib\site-packages\click\core.py", line 760, in invoke
    return __callback(*args, **kwargs)
  File "C:\Users\Ben\PycharmProjects\applicationfactoryeexamplke\venv\lib\site-packages\flask\cli.py", line 911, in run_command
    raise e from None
  File "C:\Users\Ben\PycharmProjects\applicationfactoryeexamplke\venv\lib\site-packages\flask\cli.py", line 897, in run_command
    app = info.load_app()
  File "C:\Users\Ben\PycharmProjects\applicationfactoryeexamplke\venv\lib\site-packages\flask\cli.py", line 308, in load_app
    app = locate_app(import_name, name)
  File "C:\Users\Ben\PycharmProjects\applicationfactoryeexamplke\venv\lib\site-packages\flask\cli.py", line 218, in locate_app
    __import__(module_name)
  File "C:\Users\Ben\PycharmProjects\applicationfactoryeexamplke\myproject\__init__.py", line 11, in <module>
    from myproject.azureauth import ms_identity_web
  File "C:\Users\Ben\PycharmProjects\applicationfactoryeexamplke\myproject\azureauth.py", line 9, in <module>
    app.register_error_handler(NotAuthenticatedError,lambda err: (redirect(url_for('auth.sign_in', post_sign_in_url=request.url_rule))))
NameError: name 'app' is not defined

aad.config.json 文件包含 Azure 身份驗證工作所需的應用機密。

我的文件結構如下:

Top Folder/
├─ aad.config.json
├─ myproject/
│  ├─ __init__.py
│  ├─ models.py
│  ├─ azureauth.py

在我的__init__.py中,我有以下內容:

import os
from flask import Flask
from flask_session import Session
from ms_identity_web import IdentityWebPython
from ms_identity_web.adapters import FlaskContextAdapter
from ms_identity_web.errors import NotAuthenticatedError
from ms_identity_web.configuration import AADConfig

# Import the DB module and all the models
from myproject.models import db
from myproject.azureauth import ms_identity_web


aad_configuration = AADConfig.parse_json('aad.config.json')
AADConfig.sanity_check_configs(aad_configuration)


def create_app(test_config=None):
    app = Flask(__name__,instance_relative_config=True)
    app.config.from_mapping(
        SECRET_KEY="mysecretkey",
        SQLALCHEMY_DATABASE_URI='sqlite:///mydb.db',
        SESSION_TYPE="filesystem"
    )


    # Import all of the models from . being myproject. import the actual name as seen below

    from . import login


    # Setup DB as part of this app

    db.init_app(app)
    db.app = app

    # Register each blueprint so that the routes are accessable in the main application
    app.register_blueprint(login.bp)


    Session(app)

    # return the app
    return app

在我的Models.py中,我有以下內容:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()


class User(db.Model):
  __tablename__ = 'users'
  id = db.Column(db.Integer, primary_key=True)
  username = db.Column(db.String(64))
  email = db.Column(db.String(128))
  password_enc = db.Column(db.String(128))
  confirmed = db.Column(db.Boolean, default=False)

我的登錄Login.py

from flask import Blueprint
from myproject.models import db,User


bp = Blueprint("user",__name__,url_prefix="/login")

@ms_identity_web.login_required
@bp.route("/")
def hello():
    db.create_all()
    test = User(username="Ben")
    db.session.add(test)
    db.session.commit()
    return("Hello user")

我的azureauth.py

from flask_session import Session
from ms_identity_web import IdentityWebPython
from ms_identity_web.adapters import FlaskContextAdapter
from ms_identity_web.errors import NotAuthenticatedError
from ms_identity_web.configuration import AADConfig



app.register_error_handler(NotAuthenticatedError,lambda err: (redirect(url_for('auth.sign_in', post_sign_in_url=request.url_rule))))
aad_configuration = AADConfig.parse_json('aad.config.json')
AADConfig.sanity_check_configs(aad_configuration)
adapter = FlaskContextAdapter(app) # ms identity web for python: instantiate the flask adapter
ms_identity_web = IdentityWebPython(aad_configuration, adapter)

我嘗試了各種方法,包括將 azure 身份驗證文件的內容放入主初始化文件中。 這不會返回任何錯誤,但我無法將其導入藍圖中以使用@ms_identity_web.login_required的裝飾器

我想對其進行設置,以便我可以使用此裝飾器來保護任何藍圖中的任何頁面。

我可以在單個 python 文件中 100% 正常工作。 努力思考應用程序工廠工作方式不同的地方。

為了使用@ms_identity_web.login_required裝飾器(保護藍圖端點),您需要將其作為應用變量傳遞:

例如,在您的主應用程序 ( init.py ) 中:

app.config['ms_identity_web'] = ms_identity_web

然后在藍圖位置 (azureauth.py):

app = current_app._get_current_object()
with app.app_context():
    ms_identity_web = current_app.config['ms_identity_web']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM