Как получить токен обновления с помощью 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

введите описание изображения здесь

Вы используете поток учетных данных клиента. Он не возвращает токен обновления, потому что он вам не нужен.

Токены обновления используются, когда пользователь входит в ваше приложение. Поскольку повторная проверка подлинности потребует, чтобы пользователь снова вошел в систему, вместо этого вы получаете токен обновления, чтобы получить новые токены.

Но в случае с учетными данными клиента повторная аутентификация — это просто повторная отправка того же запроса. Токен обновления ничего не добавит к этому. Отправьте тот же запрос еще раз до истечения срока действия вашего токена.

Другие вопросы по тегам