r - 如何在 R 的 httr::oauth2.0_token 中检索用于身份验证的 URL?

标签 r oauth-2.0 access-token httr

我使用下面的代码获取对存储数据的 Microsoft Dynamics 环境的 API 访问权限。

require(httr)

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?resource=https://[REDACTED].crm4.dynamics.com")

API.Key = "[REDACTED]"
API.Secret = "[REDACTED]"

App = oauth_app("[REDACTED]", key = API.Key, secret = API.Secret)

API.token = oauth2.0_token(dataverse_api, App, scope = "https://[REDACTED].crm4.dynamics.com/user_impersonation", cache = FALSE, use_oob = FALSE)

API.AuthKey = API.token$credentials$access_token

如果我在 RStudio 中运行代码,它会将我的浏览器指向一个 URL,然后我会得到响应:

Waiting for authentication in browser...
Press Esc/Ctrl + C to abort
Authentication complete

但是,如果我在 R 终端中运行代码,它会将 URL 返回到 R 终端,然后我需要将其复制并粘贴到浏览器中以完成身份验证。

我想知道的是...RStudio 正在做什么来自动化此步骤? RStudio 如何知道要打开的 URL?如何提取该 URL 并将其放入 browserURL 函数中以自动执行最后一步?这是我尝试过的...

  • 我通过输入 API.token$ 查看了 API.token 的所有参数,并继续沿着路径探索 cache_pathprivate_keyendpoint$authorizeparams$...。在所有这些参数中,我没有找到任何与从 RStudio 在网络浏览器中打开的 URL 相匹配的内容。
  • 我已尝试设置 use_oob=TRUE,但这实际上提供了 400 类型的响应。
  • 我已查看了“详细信息”部分中提供的 ?oauth2.0_token 以及指向 Token() 的链接,但我认为这没有帮助。

我期望某个地方有一个我可以提取的参数并将其放入如下代码中:

browseURL(paste("http://localhost:1410/?code=","INSERT PARAMETER HERE",sep = ""))

有人知道如何获取该参数吗?

最佳答案

相关代码在oauth-init.R底部。但就像 {httr} 中的很多内容一样,它很复杂。

{AzureAuth} 的文档更清晰。如果您在 RStudio 中,两个包都使用 authorization_code流并使用小型 {httpuv} Web 服务器来捕获重定向。可以看到需要的请求here在帮助页面上。这是请求 URL:

https://login.microsoftonline.com/{tenant id}/oauth2/v2.0/authorize?
client_id={client id}
&response_type=code
&redirect_uri={http://where-you-listen-for-the-response.might-be-localhost escaped for use in URLs}
&response_mode=query
&scope={scope escaped for use in URLs}
&state=12345

如果您在浏览器中打开上述内容,Azure 将使用请求中的 scope 登录 client_id 中指定的应用程序,然后将您重定向到 redirect_uri 带有代码。 如果您有一个在 redirect_uri 上运行的 Web 服务器(这就是 httpuv 的用武之地),并且 redirect_uri 已被该 Azure 应用程序列入白名单,那么您的R 程序接收该代码,然后可以使用它从 token 端点获取访问 token 。

这将构造 URL。您需要一些东西来管理状态

url <-
    httr::modify_url(
       endpoint_authorize,
       query = list(client_id = client_id,
                    response_type = "code",
                    redirect_uri = redirect_uri,
                    scope = scope,
                    response_mode = "query",
                    state = get_state_key())
    ) %>%
    htmltools::HTML()

从终端,它使用不需要重定向的device_code身份验证流程。相反,您可以通过将代码复制到浏览器中来充当自己的“网络链接”。

根据您的用例,这两个授权流程可能有点过头了。它是服务器安全获取 token 的一种方式,允许服务器访问您名下的资源。如果您仅获取本地计算机的 token ,并且可以控制应用程序接受的流(因为它是您自己的流),则通常可以由 client_credentials 流处理。

如果你看看上面提到的{AzureAuth}你可以看到替代方案。谷歌搜索“Azure”和流名称将引导您找到 Azure 上的文档。

关于r - 如何在 R 的 httr::oauth2.0_token 中检索用于身份验证的 URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70973156/

相关文章:

oauth-2.0 - OAuth 2.0 客户端定义

c# - GoogleWebAuthorizationBroker.AuthorizeAsync 卡住

symfony - FOSOAuthServerBundle access_token 生命周期

r - 将具有未见字符串值的新记录 append 到数据帧时出现未见因子级别,导致警告并导致 NA

r - 对数据框进行子集化,以获得 20 次重复和 2 次处理中列的最小值

r - 如何将 data.frames 分别保存在列表中?

angularjs - CORS 适用于访问 token ,但不适用于 Web Api 2 中的刷新 token

r - 为什么 PLM 会创建大量对象并且无法打开它们

python - Google OAuth2 - 如何更改 expires_in 或 token_expiry 值?

java - 如何重命名 Struts 2 token 参数