Как получить токен обновления с помощью oauth в Microsoft365?
Я пытаюсь использовать microsoft365 и oauth, чтобы получить токен доступа и обновления. Согласно документам Microsoft 365, нам нужно использовать область «offline_access», чтобы получить токен обновления вместе с токеном доступа. Однако ответ, который я получаю, не содержит токена обновления.
Вот код, который я использовал:
url = "https://login.microsoftonline.com/{}/oauth2/v2.0/token".format(tenant_id)
headers = {
"Content-Type": "application/x-www-form-urlencoded",
}
data = {
"client_id": client_id,
"client_secret": client_secret,
"grant_type": "client_credentials",
"scope": "https://graph.microsoft.com/.default offline_access",
}
response = requests.post(url, headers=headers, data=data)
Ответ содержит маркер доступа, как обычно, но не содержит маркер обновления, несмотря на использование области offline_access. Может ли кто-нибудь любезно сказать мне, в чем проблема?
2 ответа
Я согласен с @junnas Client Credential Flow, который не возвращает токен обновления, так как взаимодействие с пользователем отсутствует.
Я попытался воспроизвести то же самое в своей среде и получил результаты, как показано ниже:
Чтобы получить токен обновления, вам нужно выбрать пользовательские интерактивные потоки, такие как Auth-Code Flow.
Я создал приложение Azure AD и добавил разрешения API, как показано ниже:
Я сгенерировал код авторизации , используя следующую конечную точку:
https://login.microsoftonline.com/TenantID/oauth2/v2.0/authorize?
client_id=ClientID
&response_type=code
&redirect_uri=https://jwt.ms
&response_mode=query
&scope=https://graph.microsoft.com/.default offline_access
&state=12345
Я сгенерировал токен доступа и токен обновления , используя следующие параметры:
GET https://login.microsoftonline.com/TenantID/oauth2/v2.0/token
client_id:ClientID
client_secret:ClientSecret
scope:https://graph.microsoft.com/.default offline_access
grant_type:authorization_code
redirect_uri:redirectURi
code:code
Используя сгенерированный выше токен обновления, я успешно обновил токен доступа, как показано ниже:
GET https://login.microsoftonline.com/TenantID/oauth2/v2.0/token
client_id:ClientID
grant_type:refresh_token
refresh_token:xxx
client_secret:xxx
Вы используете поток учетных данных клиента. Он не возвращает токен обновления, потому что он вам не нужен.
Токены обновления используются, когда пользователь входит в ваше приложение. Поскольку повторная проверка подлинности потребует, чтобы пользователь снова вошел в систему, вместо этого вы получаете токен обновления, чтобы получить новые токены.
Но в случае с учетными данными клиента повторная аутентификация — это просто повторная отправка того же запроса. Токен обновления ничего не добавит к этому. Отправьте тот же запрос еще раз до истечения срока действия вашего токена.