如何在 R 的 httr::oauth2.0_token 中检索 URL 进行身份验证?

How do you retrieve the URL for authentication in R's httr::oauth2.0_token?

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

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 终端中的代码,它 returns 将 URL 放入 R 终端,然后我需要复制并粘贴到浏览器中才能完成身份验证。

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

我希望某处有一个参数,我可以将其提取并放入如下代码中:

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

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

您可以使用 httr 的 URL 构建功能,您可以在其中添加参数

httr::GET(
  url = "https://geo.stat.fi/geoserver/vaestoalue/wfs",
  query = list(
    code = "INSERT PARAMETER HERE",
    param2 = "INSERT PARAMETER2 HERE"
  )
) -> res

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

帮助页面上 {AzureAuth} are clearer. If you're in RStudio both packages are using the authorization_code flow and use a small {httpuv} web server to catch the redirect. You can see the required request 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 程序接收该代码,然后可以使用它从令牌端点获取访问令牌。

这构建了URL。您需要一些东西来管理 states。

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 身份验证流程。相反,您可以通过将代码复制到浏览器中来充当自己的“网络 link”。

根据您的用例,这两个授权流程可能有些矫枉过正。它是服务器安全获取令牌的一种方式,允许它以您的名义访问资源。如果你只是为你的本地机器获得一个令牌并且你可以控制应用程序接受的流量(因为它是你自己的),那么通常可以由 client_credentials 流.

如果您查看 above-mentioned {AzureAuth},您可以看到备选方案。谷歌搜索“Azure”和流的名称将引导您找到 Azure 上的文档。