将 curl OAuth2 令牌请求转换为 httr

Convert a curl OAuth2 token request to httr

我正在尝试使用 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'

其中 returns 没有任何重定向的令牌。

但是,我无法将其转换为等效的 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")

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

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

如有任何帮助,我们将不胜感激。

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

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 是 shorthand 因为在 header.

中包含 Content-Type: application/x-www-form-urlencoded

我通过转到端点文档 https://developer.domain.com.au/docs/v2/apis/pkg_properties_locations/references/suburbperformance_get_bynamedsuburb 并遵循“尝试一下”说明,确定 Accept="text/plain" 应该包含在 get 请求中,这样我就可以查看 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 对于超出常规或常见用例的任何情况似乎都没有特别的帮助。 它在从用户那里抽象出低级细节方面走得很远。 处理 non-standard 此类案例的小插图会有所帮助。 尽管如此,我承认我的评论可能只是因为不得不花几个小时弄清楚如何实施一个应该非常简单的过程而感到沮丧。

我会在几天内将此问题置于未答复状态,看看是否有人可以提出更好的替代方案或提供更多信息。