我有一个Python脚本,该脚本在AWS EC2 Ubuntu计算机上定期运行。
此脚本从某些文件中读取数据,有时会更改其中的数据。
我想从OneDrive下载这些文件,对它们进行处理,然后将它们上传回OneDrive。
我希望自动完成此操作,而无需用户批准任何登录名或凭据。我可以这样做一次(即在第一次运行时批准登录),但是其余的必须自动运行,而无需再次请求批准(当然,除非更改权限)。
最佳方法是什么?
我一直在阅读Microsoft Graph API上的文档,但在身份验证部分苦苦挣扎。我已经在Azure AAD中创建了一个应用程序,授予了示例权限(以进行测试)并创建了一个秘密凭据。
我设法做到了。我不确定这是否是最好的方法,但是现在可以使用了。它每小时自动运行一次,我不需要触摸它。
我关注了https://docs.microsoft.com/en-gb/azure/active-directory/develop/v2-oauth2-auth-code-flow上的信息
这就是我所做的。
Azure Portal
Web
看起来像是第一次获得令牌,我们必须使用浏览器或类似的东西。
必须有一种编程方式来执行此操作,但是我不知道如何执行此操作。我也考虑过为此使用Selenium,但是由于只有一次,而且我的应用程序每小时都会请求令牌(保持令牌新鲜),所以我放弃了这个想法。
如果添加新的权限,我们拥有的令牌将失效,我们必须再次执行本手册。
该URL将重定向
您重定向到您设置的重定向URI,并在URL中使用code = something。复制something。端点
Form URL
:grant_type = authorization_code&client_id = your_app_client_id&code = use_the_code_returned_on_previous_step这将返回访问令牌和刷新令牌。将刷新令牌存储在某处。我正在将其保存在文件中。
Python
# Build the POST parameters params = { 'grant_type': 'refresh_token', 'client_id': your_app_client_id, 'refresh_token': refresh_token_that_you_got_in_the_previous_step } response = requests.post('https://login.microsoftonline.com/common/oauth2/v2.0/token', data=params) access_token = response.json()['access_token'] new_refresh_token = response.json()['refresh_token'] # ^ Save somewhere the new refresh token. # I just overwrite the file with the new one. # This new one will be used next time. header = {'Authorization': 'Bearer ' + access_token} # Download the file response = requests.get('https://graph.microsoft.com/v1.0/me/drive/root:' + PATH_TO_FILE + '/' + FILE_NAME + ':/content', headers=header) # Save the file in the disk with open(file_name, 'wb') as file: file.write(response.content)
所以基本上,我的刷新令牌总是更新的。
[我使用该刷新令牌调用令牌端点,并且该API为我提供了在当前会话期间使用的访问令牌和新的刷新令牌。
[我下次运行程序时使用此新的刷新令牌,依此类推。