注册新应用
登录 Azure 门户,打开 Azure Active Directory,在“管理”菜单下,选择“应用注册”>“新注册” 。输入应用程序的名称,在“受支持的帐户类型”中选择“任何组织目录(任何 Azure AD 目录 – 多租户)中的帐户”,平台选择 Web,重定向 URI 输入 http://localhost
,点击“注册”,完成初始应用注册并添加客户端密码,记下应用程序 ID 和刚才生成的客户端密码。
获取访问令牌
可以通过下面的 Python 程序获取访问令牌 access_token
。
from urllib.parse import urlencode
import requests
import json
# 从 Azure AD 应用程序获取以下信息
client_id = YOU_CLIENT_ID
client_secret = YOUR_CLIENT_SECRET
redirect_uri = REDIRECT_URL
scope = 'openid offline_access Files.ReadWrite.All'
authorize_url = 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize'
token_url = 'https://login.microsoftonline.com/common/oauth2/v2.0/token'
def get_access_url():
# 构造授权 URL
params = {
'client_id': client_id,
'response_type': 'code',
'redirect_uri': redirect_uri,
'scope': scope
}
auth_url = authorize_url + '?' + urlencode(params)
return auth_url
def get_access_token():
auth_code = input('请输入授权码: ')
# 交换授权码以获取访问令牌和刷新令牌
payload = {
'client_id': client_id,
'client_secret': client_secret,
'code': auth_code,
'grant_type': 'authorization_code',
'redirect_uri': redirect_uri
}
response = requests.post(token_url, data=payload)
if response.status_code == 200:
print(f'访问令牌获取成功,access_token:{response.json()["access_token"]}')
with open('data.json', 'w') as f:
json.dump(response.json(), f)
else:
print(f'访问令牌获取失败,错误代码:{response.status_code}')
print(f'错误详细信息:{response.text}')
# 引导用户打开授权 URL 并登录以授权应用程序
url = get_access_url()
print(f'请前往以下 URL 授权应用程序:\n{url}')
get_access_token()
在此代码中,CLIENT_ID
,CLIENT_SECRET
和 REDIRECT_URI
变量需要替换为刚才注册的应用程序的相关信息。SCOPE
变量确定应用程序可以访问的权限。
登录成功后自动转跳到我们指定的重定向 URL http://localhost/?code=0.AVYA8mv…&session_state=22d1...#
,这个 URL兑换访问令牌 access_token
的的授权码,等号 = 之后符号 & 之前的一长串字符串就是授权码,把授权码粘贴到程序中继续运行即可获得访问令牌 access_token
和刷新令牌 refresh_token
。
刷新访问令牌
假设我们已经获得了访问令牌 access_token
和刷新令牌 refresh_token
,可以通过调用以下程序刷新访问令牌。
import requests
import json
# 使用 refresh token 获取新的 access_token
client_id = YOU_CLIENT_ID
client_secret = YOUR_CLIENT_SECRET
token_url = 'https://login.microsoftonline.com/common/oauth2/v2.0/token'
def get_new_access_token():
# 从文件中获取 refresh_token
with open('data.json', 'r') as f:
token_data = json.load(f)
refresh_token = token_data['refresh_token']
# 使用 refresh_token 获取新的 access_token
payload = {
'client_id': client_id,
'client_secret': client_secret,
'refresh_token': refresh_token,
'grant_type': 'refresh_token'
}
try:
response = requests.post(token_url, data=payload)
if response.status_code == 200:
with open('data.json', 'w') as f:
json.dump(response.json(), f)
return response.json()['access_token']
else:
print(f'令牌刷新失败,错误代码:{response.status_code}')
except Exception as e:
print(e)
上传文件到 OneDrive
import requests
filename = 'test_file'
folder = '/backups/'
api_url = f'https://graph.microsoft.com/v1.0/me/drive/root:/path/to/file{folder}{filename}:/content'
def upload_file():
new_access_token = get_new_access_token()
# 读取文件内容
with open(filename, 'rb') as f:
file_contents = f.read()
try:
# 上传文件到 OneDrive for Business
response = requests.put(api_url, headers={
'Authorization': f'Bearer {new_access_token}', 'Content-Type': 'application/octet-stream'},
data=file_contents)
# 检查上传是否成功
if response.status_code == 201:
print(f'文件上传成功!{response.text}')
else:
print(f'文件上传失败,错误代码:{response.status_code}, {response.text}')
except Exception as e:
print(e)
upload_file()
程序中 URTL 中的 /me/drive/root:/path/to/file
表示相对于 OneDrive 根文件夹的路径,并且必须存在,否则报错,folder
若不存在则会自动创建。例如上述程序执行成功后,所上传的文件在 Onedrive 的路径为/path/to/file/backups/test_file
。
0 条评论