我在Microsoft Dataverse中有数据,我正试图将其提取到R中。我在软件开发/API/OAuth方面没有太多背景,所以我首先使用了一个教程,向我展示了如何在Postman中使用API。然后,我在网上使用了几个教程(最值得注意的是这一个(,试图复制我在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的函数,但?oauth-refresh
给出了一个错误,?oauth_refresh
表示找不到结果。我还研究了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 = " ")))