使用MSAL文档中给出的基本示例,我无法从MSAL包中获取acquire_token_by_auth_code_flow()
以在烧瓶应用程序之外工作。
我认为问题来自于使用错误的认证响应,该认证响应必须是";从认证服务器接收的查询字符串的dict";根据文件。在烧瓶应用程序中,我可以简单地使用request.args
,我不太确定如何在烧瓶外使用。
我已经尝试过使用requests.request
和urlsplit
。设备流运行良好,使用Java中的MSAL包并通过R进行连接。因此,该应用程序似乎设置正确。
下面MSAL应用程序的基本示例代码产生错误:
状态不匹配:XXXXXXXXXXXXX vs None
(因此auth_response
是错误的(
有什么想法吗?
import requests
import msal
CLIENT_ID = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" # Application (client) ID of app registration
CLIENT_SECRET = "XX-XXXXXXXX-XXXXXXXX.XX~XXXXX~XXXX" # Placeholder - for use ONLY during testing.
AUTHORITY = "https://login.microsoftonline.com/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX"
REDIRECT_PATH = "/getAToken" # Used for forming an absolute URL to your redirect URI.
# The absolute URL must match the redirect URI you set
# in the app's registration in the Azure portal.
ENDPOINT = 'https://graph.microsoft.com/v1.0/me'
SCOPE = ["https://graph.microsoft.com/.default"]
# Cache
cache = msal.SerializableTokenCache()
# Build msal app
app = msal.ConfidentialClientApplication(
CLIENT_ID, authority=AUTHORITY,
client_credential=CLIENT_SECRET, token_cache=cache)
# Initiate auth code flow
session = requests.Session()
session.flow = app.initiate_auth_code_flow(scopes=SCOPE, redirect_uri=REDIRECT_PATH)
# Aquire token
result = app.acquire_token_by_auth_code_flow(auth_code_flow=session.flow, auth_response = dict(parse.parse_qsl(parse.urlsplit(REDIRECT_PATH).query)))
烧瓶应用程序中最后一位的等效代码与REDIRECT_PATH = "/getAToken"
:类似
@app.route(app_config.REDIRECT_PATH) # Its absolute URL must match your app's redirect_uri set in AAD
def authorized():
result = _build_msal_app(cache=cache).acquire_token_by_auth_code_flow(
session.get("flow", {}), request.args)
return redirect(url_for("index"))
根据文档,获取令牌只需要很少的请求。若要使其成为可能,您需要在导航到microsoft登录页面之前创建流并将其存储在会话中。
session["flow"] = _build_auth_code_flow(authority=app_config.AUTHORITY, scopes=app_config.SCOPE)
导航回您的应用程序后,您应该像在示例中那样使用这个流对象
result = _build_msal_app(cache=cache).acquire_token_by_auth_code_flow(
session.get("flow", {}), request.args)
确保您没有创建两次。在这种情况下,错误将是类似的,但状态不匹配:XXXXXXXXXXXXX与XXXXXXXXXXXXX。如果你打了两次电话,可能会发生这种情况。
auth_response必须是根据当前HTTP请求查询参数构建的字典。
如果这是一个桌面应用程序,则必须切换到PublicClientApplication。你可以在这里找到一个样品。