0

我正在使用 requests_oauthlib 库创建一个 Python 脚本来使用 Microsoft Graph API 服务。我能够成功创建 OAuth2.0 会话,获取授权 URL 以在 Internet 浏览器窗口中打开以进行身份​​验证,然后我被重定向到我之前在 Azure 门户中注册我的应用程序时指示的重定向 URL ( https ://portal.azure.com)。然后我复制完整的重定向 URL 以粘贴到我的应用程序中。此时,我的应用程序读取我粘贴的 URL,将嵌入在 URL 中的身份验证代码交换为完全有效的 OAuth 身份验证令牌。为了确保,我在https://jwt.ms中检查了它,除了授予的范围外,它是完美的。这些范围与我在 OAuth 会话中请求的范围不匹配。

脚本代码

# details from the library can be found at https://pypi.org/project/requests-oauthlib/
from requests_oauthlib import OAuth2Session 

client_id = <the client id from the Azure Portal when I registered my app>
client_secret = <the client secret I got from the Azure Portal>
redirect_uri = <the redirect_uri that I specified in the Azure Portal>
authorization_base_url = 'https://login.microsoftonline.com/<my tenant code>/oauth2/v2.0/authorize'
token_url = 'https://login.microsoftonline.com/<my tenant code>/oauth2/v2.0/token'
scopes = ["https://graph.microsoft.com/User.Read", "https://graph.microsoft.com/offline_access"]

# OAuth2.0 Authentication
msgraph = OAuth2Session(client_id, scope = scopes, redirect_uri=redirect_uri) # creates a OAuth 2.0 session object

# Redirect user to microsoft for authorization
# offline for refresh token
# force to always make user click authorize
authorization_url, state = msgraph.authorization_url(authorization_base_url, access_type="offline", prompt="select_account")

print('Please go here and authorize,', authorization_url) # user needs to click on this URL, authenticate and copy the URL that will be given

# Get the authorization verifier code from the callback url
redirect_response = input('Paste the full redirect URL here: ') # the user has to paste the url with the authorizaton code provided after authenticating
print('redirect_response: ', redirect_response)

# Fetches the access token AFTER the authentication code was given in the previous step
token = msgraph.fetch_token(token_url, client_secret=client_secret, authorization_response=redirect_response) # gets the access token
print('token: ', token)

但我收到以下警告消息:

警告:范围已从“ https://graph.microsoft.com/User.Read https://graph.microsoft.com/offline_access ”更改为“profile https://graph.microsoft.com/User.Read openid email ”。

AZURE 门户中的 API 权限

Microsoft Graph (2) Files.ReadWrite.All offline_access

正如您在上面的 Azure 权限中看到的,Azure 门户中的权限(范围)与我请求的范围完全相同,所以我的问题是这些“ openid ”和“电子邮件”范围是从哪里来的?我已经能够克服警告消息,但我无法请求我需要的权限。我什至在 Azure 门户中创建了一个全新的应用程序,但我遇到了同样的问题。requests_oauthlib库有问题还是我做错了什么?

谢谢

4

1 回答 1

1

请求范围时,您不需要 Graph 范围的完全限定域名 (FQDN)(它们是默认值),并且不应将它们用于非 Graph 范围(openidprofileemail,并且offline_access是 OpenID/AAD 范围,不是图表)。

scopes = ["User.Read", "offline_access"]
于 2019-10-07T14:46:13.743 回答