От питона до HTTR - PullRequest
       17

От питона до HTTR

0 голосов
/ 08 ноября 2019

У меня есть следующие параметры, которые могут аутентифицировать меня на API через python

library(reticulate)
import requests
url = 'https://api.checkbox.com/v1/my_account/oauth2/token'
payload = 'username=my_username&password=my_password&grant_type=password'

headers = {'Content-Type': 'application/x-www-form-urlencoded'}

response = requests.request('POST', url, headers = headers, data = payload, allow_redirects=False)
print(response.text)

{"access_token":"my_access_token","token_type":"bearer","expires_in":43199,"user_name":"my_username","roles":"System Administrator,Contact Administrator,Survey Administrator","account_name":"my_account","hosts":"my_account.checkboxonline.com"}

Я пытался сделать то же самое, используя httr, но получаю ошибку 400.

username <- "my_username"
password <- "my_psw"
base_url = "https://api.checkbox.com/v1/my_account/oauth2/token"

response <- POST(url=base_url,
                   authenticate(username,password),
                   add_headers("Content-Type"="application/x-www-form-urlencoded"),verbose())

Вот сгенерированные параметры запроса:

-> POST /v1/my_account/oauth2/token HTTP/1.1
-> Host: api.checkbox.com
-> Authorization: Basic jumble_hog_wash_of_my_creds
-> User-Agent: libcurl/7.64.1 r-curl/4.1 httr/1.4.1
-> Accept-Encoding: deflate, gzip
-> Accept: application/json, text/xml, application/xml, */*
-> Content-Type: application/x-www-form-urlencoded
-> Content-Length: 0
-> 
<- HTTP/1.1 400 Bad Request
<- Cache-Control: no-cache
<- Pragma: no-cache
<- Content-Type: application/json;charset=UTF-8
<- Expires: -1
<- Server: Microsoft-IIS/10.0
<- X-Powered-By: ASP.NET
<- Date: Fri, 08 Nov 2019 16:08:10 GMT
<- Content-Length: 34
<- 
Response [https://api.checkbox.com/v1/my_account/oauth2/token]
  Date: 2019-11-08 16:08
  Status: 400
  Content-Type: application/json;charset=UTF-8
  Size: 34 B

Я не уверен, как передать &'grant_type=password' с запросом. Есть идеи?

1 Ответ

1 голос
/ 08 ноября 2019

Из API DOC ваш API поддерживает аутентификацию Oauth2, используя Учетные данные для пароля владельца ресурса , использующие grant_type = "password".

Для API Oauth2 вы обычно используете httr::oauth2.0_token, но в настоящее время поток httr Oauht2 не поддерживает этот тип гранта.

Вы должны сделать это сами.

Из документа (я не пробовал, поскольку у меня нет доступа к этому API), вам нужно будет использовать POST с телом, содержащим ваш параметр.

Это должно работать:

username <- "my_username"
password <- "my_psw"
base_url = "https://api.checkbox.com/v1/my_account/oauth2/token"

response <- POST(url=base_url,
                 # pass data to the POST request
                 body = list(
                   username = username,
                   password = password,
                   grant_type = "password"
                 ),
                 # application/x-www-form-urlencoded
                 encode = "form",
                 verbose())

Посмотрите, что, используя httpbin.org в качестве примера, вы получите тот же заголовок, что и в вашем примере, когда ваши данные передаются как форма в POST

username <- "my_username"
password <- "my_psw"

response <- httr::POST(
  # for demo
  url= "https://httpbin.org/post", 
  # pass data to the POST request
  body = list(
    username = username,
    password = password,
    grant_type = "password"
  ),
  # application/x-www-form-urlencoded
  encode = "form")

jsonlite::prettify(httr::content(response, "text"))
#> No encoding supplied: defaulting to UTF-8.
#> {
#>     "args": {
#> 
#>     },
#>     "data": "",
#>     "files": {
#> 
#>     },
#>     "form": {
#>         "grant_type": "password",
#>         "password": "my_psw",
#>         "username": "my_username"
#>     },
#>     "headers": {
#>         "Accept": "application/json, text/xml, application/xml, */*",
#>         "Accept-Encoding": "deflate, gzip",
#>         "Content-Length": "56",
#>         "Content-Type": "application/x-www-form-urlencoded",
#>         "Host": "httpbin.org",
#>         "User-Agent": "libcurl/7.64.1 r-curl/4.2.9000 httr/1.4.1"
#>     },
#>     "json": null,
#>     "origin": "176.158.63.46, 176.158.63.46",
#>     "url": "https://httpbin.org/post"
#> }
#> 

Создано в 2019-11-08 пакетом Представить (v0.3.0)

Надеюсь, это поможет

...