【问题标题】:How to verify oauth token generated using Microsoft Graph API如何验证使用 Microsoft Graph API 生成的 oauth 令牌
【发布时间】:2020-12-10 17:06:51
【问题描述】:

我正在使用以下代码获取誓言令牌:

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))

我正在寻找一个 microsoft graph api,通过它我可以验证生成的 oauth 令牌是否过期。任何人都可以请我指向一些文档页面吗?

【问题讨论】:

  • 响应正文 (ret_body) 必须包含其他属性,如 expiresIn、expiresOn、资源等。您可以利用这些属性
  • @Despicableme 其实我还有另一种情况。我只会收到 access_token 而不是属性,所以我只需要使用访问令牌来验证它是否有效

标签: azure oauth microsoft-graph-api token azure-ad-graph-api


【解决方案1】:

正如cmets中的卑鄙所提到的,当您访问令牌时,响应json包含一个字段expires_in。下面是我请求访问令牌时响应json的截图,我这边expires_in的值是82799,但你这边可能是3599(1小时)。

您可以在代码中使用ret_body['expires_in'] 来获取该字段。

=============================更新=========== ======================

由于您只能接收访问令牌而不能接收更多字段,因此您可以解析(解码)访问令牌以获取过期日期。

当我们解析this页面中的token进行测试时,我们可以发现有一个声明exp(in timestamp format)表示token的过期日期。所以我们只需要解析token并获取属性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

【讨论】:

  • 我只会收到访问令牌,所以我需要找到一些方法来验证它是否有效
  • 嗨@SAndrew,我稍后会根据您的要求更新我的答案。
猜你喜欢
  • 2021-03-04
  • 2017-06-18
  • 2021-01-04
  • 1970-01-01
  • 2016-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多