上传文件至 /
This commit is contained in:
parent
2a52b24368
commit
e3d33890bb
|
@ -0,0 +1,76 @@
|
|||
import requests
|
||||
import time
|
||||
|
||||
# 1. 定义应用凭据
|
||||
client_id = 'XXXXXXXXXXXXXX' # 替换为你的应用 ID
|
||||
scope = 'offline_access user.read mail.read' # 确保权限范围正确
|
||||
|
||||
# 2. 获取设备代码
|
||||
device_url = 'https://login.microsoftonline.com/consumers/oauth2/v2.0/devicecode'
|
||||
device_response = requests.post(device_url, data={
|
||||
'client_id': client_id,
|
||||
'scope': scope
|
||||
})
|
||||
|
||||
# 检查请求是否成功
|
||||
if device_response.status_code != 200:
|
||||
print(f"Failed to get device code. Status code: {device_response.status_code}")
|
||||
print(f"Error response: {device_response.text}")
|
||||
exit()
|
||||
|
||||
# 解析设备代码响应
|
||||
device_data = device_response.json()
|
||||
print("Device data:", device_data)
|
||||
|
||||
# 确保 device_code 存在
|
||||
if 'device_code' not in device_data:
|
||||
print("Error: 'device_code' not found in device data")
|
||||
exit()
|
||||
|
||||
device_code = device_data['device_code']
|
||||
user_code = device_data['user_code']
|
||||
verification_url = device_data['verification_uri']
|
||||
interval = device_data.get('interval', 5) # 默认间隔时间 5 秒
|
||||
|
||||
print(f"Please navigate to {verification_url} and enter the code: {user_code}")
|
||||
|
||||
# 3. 等待用户完成身份验证
|
||||
timeout = time.time() + 900 # 15 分钟超时
|
||||
authorized = False
|
||||
|
||||
while time.time() < timeout:
|
||||
time.sleep(interval)
|
||||
|
||||
token_url = 'https://login.microsoftonline.com/consumers/oauth2/v2.0/token'
|
||||
token_response = requests.post(token_url, data={
|
||||
'client_id': client_id,
|
||||
'device_code': device_code,
|
||||
'grant_type': 'urn:ietf:params:oauth:grant-type:device_code'
|
||||
})
|
||||
|
||||
if token_response.status_code == 200:
|
||||
authorized = True
|
||||
break
|
||||
elif token_response.status_code == 400:
|
||||
error = token_response.json().get('error')
|
||||
if error != 'authorization_pending':
|
||||
print(f"An error occurred: {error}")
|
||||
print(f"Error response: {token_response.json()}")
|
||||
break
|
||||
|
||||
if not authorized:
|
||||
print("Authorization timed out.")
|
||||
else:
|
||||
# 4. 获取访问令牌
|
||||
token_data = token_response.json()
|
||||
access_token = token_data['access_token']
|
||||
refresh_token = token_data['refresh_token']
|
||||
print("Access token acquired successfully!")
|
||||
|
||||
# 5. 使用访问令牌调用受保护的资源
|
||||
user_info_url = 'https://graph.microsoft.com/v1.0/me'
|
||||
headers = {
|
||||
'Authorization': f'Bearer {access_token}'
|
||||
}
|
||||
user_info_response = requests.get(user_info_url, headers=headers)
|
||||
print("User information:", user_info_response.json())
|
Loading…
Reference in New Issue