Как проверить токен oauth, сгенерированный с помощью Microsoft Graph API

Я получаю токен присяги, используя следующий код:

def get_token():

    try:
    
        r = requests.post("https://login.microsoftonline.com/" + config_data['TENNANT_ID'] + "/oauth2/token",
        
            data = {"grant_type": "client_credentials",
                  "client_secret": config_data['CLIENT_SECRET'],
                  "client_id": config_data['CLIENT_ID'],
                  "resource": "https://graph.microsoft.com"})
                  
        if r.status_code == 200:
            ret_body = r.json()
            return ret_body['access_token']
            
        else:
            log.error("Unable to get token from oauth {}, {}".format(r.status_code, r.json()))
            return "false"
            
    except Exception as e:
        log.error("Exception occurred while getting oauth token {}".format(e))

Я ищу API-интерфейс Microsoft Graph, с помощью которого я могу проверить, истек ли срок действия сгенерированного токена oauth или нет. Может ли кто-нибудь указать мне на какую-нибудь страницу документации для этого.?

тело ответа (ret_body) должно содержать другие атрибуты, такие как expiresIn ,expiresOn, resource и т. д. Вы можете использовать эти атрибуты

Despicable me 10.12.2020 19:01

@Despicableme На самом деле у меня есть другой сценарий. Я получу только access_token, а не атрибуты, поэтому мне просто нужно использовать токен доступа, чтобы проверить, действителен он или нет.

S Andrew 11.12.2020 07:50
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
3
2
448
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как упоминал Гадкий в комментариях, когда вы получаете доступ к токену, ответ json содержит поле expires_in. Ниже приведен скриншот ответа json, когда я запрашиваю токен доступа, значение expires_in составляет 82799 на моей стороне, но может быть 3599 (1 час) на вашей стороне.

Вы можете использовать ret_body['expires_in'] в своем коде, чтобы получить поле.

===========================Обновление===================== ===========

Поскольку вы можете получить только токен доступа, но не поля, вы можете проанализировать (декодировать) токен доступа, чтобы получить дату истечения срока действия.

Когда мы анализируем токен на этой странице для тестирования, мы можем обнаружить, что есть утверждение exp (в формате метки времени), которое означает дату истечения срока действия токена. Итак, нам просто нужно проанализировать токен и получить свойство exp, а затем преобразовать его из метки времени в дату и время.

Ниже приведена часть моего кода для справки:

if r.status_code == 200:
    ret_body = r.json()
    accessToken = ret_body['access_token']
    decodedJson = jwt.decode(accessToken, verify=False)
    timestamp = decodedJson["exp"]
    resultDateTime = datetime.fromtimestamp(timestamp)

resultDateTime — это время истечения срока действия вашего токена доступа, вы можете сравнить его с текущим временем (вы также можете пропустить изменение временной метки в формате даты и времени в своем коде, напрямую сравнить временную метку с текущей датой).

Для успешного выполнения кода вам также необходимо установить pip install pyjwt и добавить эти строки в свой код Python:

import jwt
import json
from datetime import datetime

Я получу только токен доступа, поэтому мне нужно найти способ проверить его, действителен он или нет.

S Andrew 11.12.2020 07:51

Привет @SAndrew Я обновлю свой ответ позже по вашему требованию.

Hury Shen 11.12.2020 08:04

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

AzureStorage: серверу не удалось аутентифицировать запрос. Убедитесь, что значение заголовка Authorization сформировано правильно, включая подпись
Ошибка Vercel Google OAuth JSON при попытке входа, но она работает на локальном хосте, в чем может быть проблема с vercel?
Как получить токен обновления с помощью oauth в Microsoft365?
Токен oauth не содержит информации о ролях или области действия
Flutter и Supabase - глубокая ссылка OAuth не работает
Как авторизовать мое приложение React через GitHub OAuth?
Как устранить ошибку динамической регистрации EPIC FHIR OAuth2 «invalid_client_metadata»? Работает ли конечная точка динамической регистрации EPIC?
Flutter: как удалить/отключить поставщика OAuth, такого как Google/Apple/Facebook, из учетной записи в моем приложении Firebase?
Запрос API с токеном носителя в Angular
Как добавить метод входа по электронной почте и паролю в существующую учетную запись, созданную с помощью стороннего поставщика, такого как google/facebook, в моем проекте firebase