将 curl OAuth2 令牌请求转换为 httr

Posted

技术标签:

【中文标题】将 curl OAuth2 令牌请求转换为 httr【英文标题】:Convert a curl OAuth2 token request to httr 【发布时间】:2021-05-18 00:50:35 【问题描述】:

我正在尝试使用 r 和 httr 访问 domain.com.au api。 我可以使用 API 密钥来实现这一点,但不能使用 OAuth2

文档表明:

通过客户端凭据获取访问令牌 使用您的 client_id 和 client_secret 以及您需要的范围列表向 https://auth.domain.com.au/v1/connect/token 端点发出 POST 请求。有关每个端点所需的范围列表,请参阅 API 参考。尝试使用计划中未包含的范围将导致 400 invalid_scope 错误。此请求必须使用基本身份验证进行身份验证,其中 client_id 和 client_secret 分别对应用户名和密码。

https://developer.domain.com.au/docs/v2/authentication/oauth/client-credentials-grant

curl 的实现很简单:

curl -X POST -u 'clientid:secret' -H "Content-Type: application/x-www-form-urlencoded" -d 'grant_type=client_credentials&scope=api_listings_read%20api_agencies_read' 'https://auth.domain.com.au/v1/connect/token'

返回令牌而不进行任何重定向。

但是,我无法将其转换为等效的 httr POST 请求以获取令牌。我目前拥有的是:

oep <- oauth_endpoint(base_url = "https://auth.domain.com.au/v1/connect/token", 
                      request = NULL, 
                      access = "access_token" )

myapp <- oauth_app("domain",
     key = "client_id_here",
     # The secret isn't secrete. A user still has to authenticate when redirected.
     secret = "secret_here"
  )

# Retrieve the token
token <- oauth2.0_token(oep, 
                    myapp, 
                    scope = "api_listings_read")

这会不必要地重定向到一个未知页面,我将其关闭,然后返回到控制台,然后按 Escape 退出。

我正在审查Converting cURL to httr in R,但到目前为止还没有成功。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

我解决了这个问题。似乎最简单的解决方案是将所有内容都包含在正文中

r <- POST("https://auth.domain.com.au/v1/connect/token",
          config = list(),
          body = list(
            grant_type="client_credentials",
            client_id="myclientid",
            client_secret="mysecret",
            scope="api_suburbperformance_read"
          ),
          encode = "form"
)
warn_for_status(r)          
content(r)

$access_token
[1] "my_requested_token"

$expires_in
[1] 43200

$token_type
[1] "Bearer"

tok <- content(r)$access_token

rg <- GET("https://api.domain.com.au/v2/suburbPerformanceStatistics/NSW/Pyrmont/2009",
          add_headers("Content-Type"="application/x-www-form-urlencoded",
                      Accept="text/plain",
                      "Authorization"=paste("Bearer", tok)))

warn_for_status(rg)


content(rg)

$header
$header$suburb
[1] "Pyrmont"

$header$state
[1] "NSW"

$header$propertyCategory
[1] "House"


$series
$series$seriesInfo
$series$seriesInfo[[1]]
$series$seriesInfo[[1]]$year
[1] 2020

$series$seriesInfo[[1]]$month
[1] 2
 
etc. etc.

其中form 是在标题中包含Content-Type: application/x-www-form-urlencoded 的简写。

我发现Accept="text/plain" 应该包含在获取请求中,方法是转到端点文档https://developer.domain.com.au/docs/v2/apis/pkg_properties_locations/references/suburbperformance_get_bynamedsuburb 并按照“试用”说明进行操作,以便我可以查看curl 命令结构(注意-H 部分命令如下)。

curl -X GET "https://api.domain.com.au/v2/suburbPerformanceStatistics/NSW/Pyrmont/2009?bedrooms=3&startingPeriodRelativeToCurrent=1&totalPeriods=4" -H "accept: text/plain" -H "Authorization: Bearer my_requested_token"

顺便说一句,作为使用httr 的初学者,我将评论说,该api 对于常规或常见用例之外的任何情况似乎都没有特别的帮助。 它在从用户那里抽象出低层次的细节方面走得很远。 处理诸如此类的非标准案例的小插曲将有助于提供帮助。 尽管如此,我承认我的评论可能只是因为不得不花费几个小时来弄清楚如何实现应该是一个微不足道的简单过程的挫败感。

我将把这个问题搁置几天,看看是否有其他人可以提出更好的替代方案或提供一些额外的信息。

【讨论】:

我感受到了你的痛苦,不反对。但是,您的肥皂盒不太可能接触到对httr 包有影响的任何人。一个更好的地方(这将引起所有合适的人的注意)是在他们的 github repo 中作为new issue。通常情况下,他们可能更喜欢一个简单的请求,也许是上述小插曲的骨架,并填写一两个示例。 这个工具可以将任何 curl 请求转换成另一种语言,这是我发现的最有用的在线转换器。显着提高了将 API 集成到各种应用程序中的效率和易用性。 curl.trillworks.com/#r

以上是关于将 curl OAuth2 令牌请求转换为 httr的主要内容,如果未能解决你的问题,请参考以下文章

将 paypal curl 获取访问令牌请求转换为 guzzle

尝试使用 PayPal 的 api 并需要帮助将 Curl 转换为 PHP

将 Postman“获取新的授权令牌”转换为 curl 命令

Swift Alamofire 上的 Django oauth2 令牌请求失败

如何将 instagram curl 发布请求转换为 javascript 请求?

Spring oauth2 刷新令牌 - 无法将访问令牌转换为 JSON