使用Web应用程序检索令牌

时间:2017-03-15 13:44:19

标签: python microsoft-graph

我在这里遵循了代码:

https://github.com/microsoftgraph/python3-connect-rest-sample

以便能够从没有用户界面的远程计算机访问我的OneDrive文件夹上的Excel工作表。

问题是我需要在我的机器上设置一个烧瓶应用程序才能获得access_token

特别是,这意味着我需要启动烧瓶服务器,手动打开浏览器,导航到http://localhost:5000,这将启动OAuth流程并检索令牌。然后,我将检索到的access_token发送到我的远程实例,在那里我可以继续工作。

我可以用硒自动完成所有这些,但我觉得这太复杂了。当然,必须有更好的方法以合理的方式做到这一点吗?

1 个答案:

答案 0 :(得分:1)

有两种方法可以获得没有提示输入用户名和用户界面的用户界面的令牌。密码和没有授权代码的舞蹈:

  • 使用资源所有者密码凭据流 - 这允许您将用户名和密码传递给Azure AD。如果在身份验证流程中有任何额外的事情(同意,MFA,密码重置),您将会遇到失败。
  • 使用客户端凭据流 - 此操作需要管理员同意。此外,您必须非常小心这个,因为此客户端将有权访问所有用户的所有信息。这应仅用于安全客户端,而不是其他用户可以访问的客户端。

这是一个代码片段,展示了这两个:

import adal
import requests

tenant = "contoso.com"
client_id = "YOUR_CLIENT_ID"
client_secret = "YOUR_CLIENT_SECRET"

username = "foo@contoso.com"
password = "mypassword"

authority = "https://login.microsoftonline.com/" + tenant
RESOURCE = "https://graph.microsoft.com"

context = adal.AuthenticationContext(authority)

# Use this for Client Credentials
#token = context.acquire_token_with_client_credentials(
#    RESOURCE,
#    client_id,
#    client_secret
#)

# Use this for Resource Owner Password Credentials (ROPC)  
token = context.acquire_token_with_username_password(RESOURCE, username, password, client_id);

graph_api_endpoint = 'https://graph.microsoft.com/v1.0{0}'

# /me only works with ROPC, for Client Credentials you'll need /<UsersObjectId/
request_url = graph_api_endpoint.format('/me')
headers = { 
    'User-Agent' : 'python_tutorial/1.0',
    'Authorization' : 'Bearer {0}'.format(token["accessToken"]),
    'Accept' : 'application/json',
    'Content-Type' : 'application/json'
}

response = requests.get(url = request_url, headers = headers)

注意:我正在回答一个非常相似的问题:MS Graph authentication using python