客户端凭据流中的requests-oauthlib自动刷新承载令牌?

时间:2019-11-04 16:20:22

标签: python-3.x microsoft-graph

我正在使用python requests-oauthlib包连接到Microsoft Graph。我正在使用OAuth 2.0客户端凭据流程。

以下简化的代码可以很好地工作:

from oauthlib.oauth2 import BackendApplicationClient
from requests_oauthlib import OAuth2Session
client = BackendApplicationClient(client_id='myclientid')

token_url = "https://login.microsoftonline.com/mydomain.onmicrosoft.com/oauth2/v2.0/token"
msgraph = OAuth2Session(client=client)

msgraph.fetch_token(
    token_url = token_url,
    client_secret = 'myclientsecret',
    scope='https://graph.microsoft.com/.default')

response = msgraph.get(
    url="https://graph.microsoft.com/v1.0/users/user@mydomain.com/messages")

尽管可行,但此情况下的Bearer访问令牌仅在1小时内有效。 request-oauthlib程序包具有support for refreshing tokens,但似乎仅限于带有单独的刷新令牌的令牌类型。与Microsoft Graph一起使用的客户端凭据流仅发出access_token。

所以我的问题是:

  1. 在这种用例中,是否有一种方法可以使requests-oauthlib自动刷新令牌,还是需要手动跟踪令牌的寿命并根据需要显式刷新令牌?
  2. 我不愿嫁给requests-oauthlib,所以如果有更好的库可以完成自动刷新,我会很感兴趣。

2 个答案:

答案 0 :(得分:0)

此行为是设计使然(符合OAuth规范)。支持刷新令牌的唯一OAuth授予是Authorization CodeResource Owner Password CredentialsImplicitClient Credentials授予仅返回访问令牌。

更重要的是,由于客户端凭据流不是交互式的,因此不需要刷新令牌。您只需要在旧令牌过期时请求一个新令牌即可。

答案 1 :(得分:0)

据我所知,仍然没有内置的方法可以使用requests-oauthlib自动执行此操作。他们的GitHub上有一张票,上面有一些关于如何执行的不同想法,但是没有现成的东西:https://github.com/requests/requests-oauthlib/issues/260