R: eBay OAuth — запрос на предоставление учетных данных клиента

Я пытаюсь разобраться с OAuth и решил поиграть с eBay API. Следуя их инструкциям, чтобы получить токен доступа к приложению, я получаю ошибку 400.

library(jsonlite)
library(httr)

# OAuth credentials
client_id <- "x"
client_secret <- "x"
# Required - https://developer.ebay.com/api-docs/static/oauth-base64-credentials.html
encod_oauth <- base64_enc(paste0(client_id, ":", client_secret))

auth_token_res <- 
  POST("https://api.sandbox.ebay.com/identity/v1/oauth2/token",
       add_headers("Content-Type" = "application/x-www-form-urlencoded",
                   Authorization = paste0("Basic ", encod_oauth)),
       body = list(grant_type = "client_credentials", 
                   scope = urlEncode("https://api.ebay.com/oauth/api_scope", reserved = T)))

Судя по содержимому, это, по-видимому, связано с grant_type в теле.

content(auth_token_res)
$error_description
[1] "grant type in request is not supported by the authorization server"

Что не так с запросом тела и почему?


person rsylatian    schedule 25.04.2020    source источник
comment
Пробовал оба безуспешно, спасибо.   -  person rsylatian    schedule 26.04.2020
comment
content(auth_token_res) выдает ту же ошибку.   -  person rsylatian    schedule 27.04.2020
comment
Пробовал cURL и получил ошибку: {"error":"invalid_request","error_description":"request is missing a required parameter or malformed."}(base). Думаю, обращение в службу поддержки может быть к лучшему.   -  person rsylatian    schedule 27.04.2020
comment
возможно, руководство по API не было обновлено   -  person chinsoon12    schedule 27.04.2020


Ответы (2)


это заняло полтора часа, но я сделал. ниже вы можете найти код, написанный на R. Хорошего дня. Я надеюсь, что это будет решением.

library(httr)
library(jsonlite)
library(base64enc)

rm(list=ls()) # delete memory
code <- base64encode(charToRaw("TT"));

#getting data from api 
resp <- POST("https://api.ebay.com/identity/v1/oauth2/token",
             query = list(grant_type="client_credentials",scope="https://api.ebay.com/oauth/api_scope"),
            add_headers(`Content-Type`='application/x-www-form-urlencoded',
                        `Authorization`=paste("Basic",code, sep=" ")))

if (http_type(resp) != "application/json") {
  stop("API did not return json", call. = FALSE)
}
parsed <- jsonlite::fromJSON(content(resp, "text",encoding = "UTF-8"), simplifyVector = TRUE)
parsed_v2 <- parsed[["response"]]
person ORCAs    schedule 26.09.2020

Я оставляю здесь рабочий пример. Это очень сложно сделать, но я сделал. Сначала я получаю токен доступа к приложению, а затем использую его для API поиска. Это код node.js.

var axios = require('axios');
var qs = require("querystring");
//The client credentials grant flow
//https://developer.ebay.com/api-docs/static/oauth-client-credentials-grant.html

axios("https://api.ebay.com/identity/v1/oauth2/token", {
    method: "POST",
    headers: {
        "Content-Type": "application/x-www-form-urlencoded",
        "Authorization": "Basic " + Buffer.from(
            //App ID (Client ID):
            `your id and secret key here with : seperated`
        ).toString('base64')
    },
    data: qs.stringify({
        grant_type: "client_credentials",
        scope: "https://api.ebay.com/oauth/api_scope",
        // parsed from redirect URI after returning from eBay,

    })
})
    .then(response => {
        console.log("Application data");
        console.log(response.data.access_token);

        axios("https://api.ebay.com/buy/browse/v1/item_summary/search", {
            method: "GET",
            headers: {
                Authorization: "Bearer " + response.data.access_token
            },
            params: {
                category_ids: "108765",
                q: "Beatles"
            }
        })
            .then(res => {
                // console.log(res.data);
                res.data.itemSummaries.map((e) => console.log(e.title));
            })
            .catch(err => {
                console.log("**************Get search error**************")
                console.log(err)
            });
    })
    .catch(err => {
        console.log("**************Get access token error**************")
        console.log(err)
    });
person ORCAs    schedule 24.09.2020
comment
У меня возникла проблема с токеном доступа пользователя. Если вы решили это и получили токен доступа пользователя. Мы будем работать вместе. Это очень тревожный процесс. - person ORCAs; 24.09.2020
comment
Не могу отметить это как завершенное, потому что я искал ответ R. Говоря это, здесь очень мало информации на любом языке, поэтому, надеюсь, это будет полезно кому-то еще. - person rsylatian; 26.09.2020
comment
Если у меня будет время, я сделаю это с R и поделюсь отсюда. Вы правы, когда ищете решение R. Лучше. На самом деле, когда я писал это решение, я думал, что никто не ответит или не посмотрит на вопрос 5 месяцев назад :) Я искал решение для токена доступа пользователя и увидел, что на эту проблему никто не ответил. Я хотел написать. - person ORCAs; 26.09.2020