为什么 r 中的 httr 包总是提供相同的访问令牌?

Why does the httr package in r always give the same access token?

我在 Microsoft Dataverse 中有数据,我正试图将其提取到 R 中。我在软件开发/API/OAuth 方面没有太多背景,所以我首先使用了一个向我展示如何使用 API 的教程在邮递员中。然后我使用了几个在线教程(最著名的是 this one)来尝试复制我在 Postman 中所做的事情。这样做,我想出了下面的代码:

require(httr)
require(rvest)

dataverse_api = oauth_endpoint(request = NULL, 
   authorize = https://login.microsoftonline.com/REDACTED/oauth2/v2.0/authorize,
   access = https://login.microsoftonline.com/REDACTED/oauth2/v2.0/token,
   base_url = https://login.microsoftonline.com/common/oauth2/authorize?resourcehttps://org593dc393.crm4.dynamics.com)

API.Key = "REDACTED"
API.Secret = "REDACTED"

App = oauth_app("EPS Project Development", key = API.Key, secret = API.Secret)

API.token = oauth2.0_token(dataverse_api, App, scope = https://org593dc393.crm4.dynamics.com/.default)
API.AuthKey = API.token$credentials$access_token

GET.Buildings = GET(https://org593dc393.crm4.dynamics.com/api/data/v9.2/crfd0_dartbuildingses, add_headers(Authorization = paste("Bearer", API.AuthKey, sep = " ")))

第一天,上面的代码成功了,我 太兴奋了! 第二天,没有更改代码,它返回了 401(未经授权)的响应.我一直在 Postman 和 R 之间来回走动,试图弄清楚有什么不同,我意识到每次我在 Postman 中进行身份验证时,我都会得到一个全新的访问令牌(如预期的那样);然而,在 R 中,当我保留 运行 这段代码时,存储在 API.token$credentials$access_token 中的参数是相同的。我不太确定这是为什么。

再做一些研究,我似乎需要一个刷新令牌?我不明白,因为这是其他开发人员发布的相同代码,而且似乎没有其他人提到它只能工作一次,如果没有刷新令牌就再也不会工作。此外,检查 httr 的文档似乎 oauth2.0_token 函数的一部分似乎是检查令牌是否需要刷新。无论如何,当我查看参数 API.token$refresh() 时,它告诉我 Error: Refresh token not available.

所以现在我试图获得一个刷新令牌,同样没有真正理解为什么。 httr 包的文档详细介绍了一个名为 oauth-refresh, but ?oauth-refresh gives an error and ?oauth_refresh says no results found. I also looked into this package by MatthewJWhittle 的函数,该函数具有一个名为 refresh_token 的函数,但在安装该包后,帮助函数再次没有结果,所以我猜它不再是一个有效的包。

TLDR:为什么我每次请求授权时返回的代码都带有相同的访问令牌?我是否错过了代码中应该请求刷新令牌的步骤?或者,如果这是设计使然,我如何在这个过期后获得一个新的?

事实证明我只需要添加 cache = FALSE 这样我就不会使用缓存的令牌。如果它对任何人有帮助,现在完整的代码是:

require(httr)
require(rvest)

dataverse_api = oauth_endpoint(request = NULL, 
   authorize = https://login.microsoftonline.com/REDACTED/oauth2/v2.0/authorize,
   access = https://login.microsoftonline.com/REDACTED/oauth2/v2.0/token,
   base_url = https://login.microsoftonline.com/common/oauth2/authorize?resourcehttps://org593dc393.crm4.dynamics.com)

API.Key = "REDACTED"
API.Secret = "REDACTED"

App = oauth_app("EPS Project Development", key = API.Key, secret = API.Secret)

API.token = oauth2.0_token(dataverse_api, App, scope = https://org593dc393.crm4.dynamics.com/user_impersonation, cache = FALSE)
API.AuthKey = API.token$credentials$access_token

GET.Buildings = GET(https://org593dc393.crm4.dynamics.com/api/data/v9.2/crfd0_dartbuildingses, add_headers(Authorization = paste("Bearer", API.AuthKey, sep = " ")))