2017-03-15 53 views
0

獲取令牌等我跟着代碼在這裏:比web應用程序

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

爲了能夠訪問Excel從遠程機器上我的OneDrive文件夾張紙沒有UI。

問題是我需要在我的機器上設置燒瓶應用程序才能獲得access_token

特別是,這意味着我需要啓動燒瓶服務器,手動打開瀏覽器,導航到http://localhost:5000,啓動OAuth進程並檢索令牌。然後,我將檢索到的access_token發送到我可以繼續工作的遠程實例。

我可以用硒自動化所有這些,但我覺得這太複雜了。當然,以合理的方式必須有更好的方式來做到這一點?

+0

Speedwise,Scrapy比硒快如果你找不到其他解決方案,我建議你看看scrapy。 –

+0

我想你可能錯過了這個問題的要點? – elelias

回答

1

有兩種方法可以獲取一個令牌,而不該用戶名&密碼,並沒有授權碼舞蹈提示的UI:

  • 使用資源所有者密碼憑據流 - 這可以讓你通過用戶名和密碼到Azure AD。如果在認證流程中有任何額外的事情(同意,MFA,密碼重置),你只能得到一個失敗。
  • 使用客戶端證書流程 - 這需要管理員同意。此外,你必須非常小心這個,因爲這個客戶端將有權訪問所有用戶的所有信息。這應該只用於安全的客戶端,而不是其他用戶可以訪問的客戶端。

下面是一個代碼片段,展示了這兩種:

import adal 
import requests 

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

username = "[email protected]" 
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

+0

'acquire_token_with_client_credentials'爲我做了。當使用'acquire_token_with_username_password'時,我得到「AdalError:不支持的wstrust端點版本,當前的支持版本是wstrust2005或wstrust13」。非常感謝 – elelias

+0

聽起來就像您擊中了資源所有者密碼憑證流程的另一個警告:不適用於許多不同的可能的聯邦設置。 – Saca

+0

再次。所以事實證明這是行不通的,因爲我沒有指定範圍參數。看起來像這樣'request_token_params = {'scope':'User.Read Mail.Send Files.Read Files.ReadWrite','expires_in':'86400'},' 有沒有辦法解決這個問題? – elelias