我使用下面的代码获取对存储数据的 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_path
、private_key
、endpoint$authorize
、params$...
。在所有这些参数中,我没有找到任何与从 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/