Как получить OAuth-токен из ebay API, используя Express, Node, Javascript - PullRequest
0 голосов
/ 05 октября 2019

Какая комбинация запросов и ответов необходима для получения токена Oauth от eBay? Что такое runame и какие заголовки мне нужны, чтобы eBay был счастлив?

Ответы [ 2 ]

1 голос
/ 05 октября 2019

После трех разочаровывающих дней, когда я пытался заставить Эбая дать мне токен доступа, я наконец-то решил его. Так как документы - это боль, а помощь в Интернете практически не помогает, я решил опубликовать здесь свое решение в надежде, что оно поможет другим. Я плохо разбираюсь в StackOverflow, поэтому дайте мне знать, если мне нужно улучшить форматирование.

app.get("/login/ebay", (req, res) => {
res.redirect(`https://auth.sandbox.ebay.com/oauth2/authorize?client_id=DeanSchm-TestApp-SBX-b843acc90-fd663cbb&redirect_uri=Dean_Schmid-DeanSchm-TestAp-kqmgc&response_type=code`
  );
});

Первое, что вам нужно сделать, это перенаправить на этот URL.

Формат такой:this

https://auth.sandbox.ebay.com/oauth2/authorize?client_id=&redirect_uri=&response_type=code

Существует также свойство scope, но я пока не понимаю этого, и я получил токен без него.

Этот URL-адрес ведет вас на eBayстраница авторизации. Если вы используете «песочницу», вам нужно создать пользователя «песочницы» и войти в систему с учетными данными «песочницы».

Как только вы войдете в систему, eBay перенаправит вас на выбранный вами URL. Вы вводите URL-адрес, на который хотите перенаправиться, сюда.

Oauth Accepted URL

Он находится в разделе для разработчиков ebay в разделе «Получение токена от Ebay через ваше приложение».

Этот URL может быть любым. вам просто нужно обработать его в узле, выражении или где-либо еще, потому что, как только кто-то подпишется в этом URL-адресе, он и направится.

Вот как я обработал это

app.get("/auth/ebay/callback", (req, res) => {
  axios("https://api.sandbox.ebay.com/identity/v1/oauth2/token", {
    method: "post",
    headers: {
      "Content-Type": "application/x-www-form-urlencoded",
      Authorization:
        "Basic " +
        btoa(
          `client public key:client secret keys`
        )
    },
    data: qs.stringify({
      grant_type: "authorization_code",
      // parsed from redirect URI after returning from eBay,
      code: req.query.code,
      // this is set in your dev account, also called RuName

      redirect_uri: "Dean_Schmid-DeanSchm-TestAp-kqmgc"
    })
  })
    .then(response => console.log(response))
    .catch(err => console.log(err));
});

Aнесколько ошибок, которые достали меня.

  • Убедитесь, что в заголовке авторизации у вас есть пробел после "Basic".
  • bota - сторонняя библиотека, в которой base 64 кодирует ваш открытый и секретный ключи. ,Есть много способов сделать это. Я просто сделал это так, потому что я украл кучу кода.
  • В Axios тело запроса называется data, а в fetch и других методах оно может называться как-нибудь еще, например body или param
  • Метод Axios находится в запросе get из-за перенаправления с ebay по умолчанию на http get.
  • ebay теперь использует https. Убедитесь, что вы используете песочницу URL
0 голосов
/ 17 октября 2019

Мы также должны были использовать JS для eBay API и решили проблему, о которой вы упомянули, при разработке нового Lib. Это доступно здесь (к вашему сведению: оно все еще WIP). Эта библиотека также автоматически попытается обновить токен, если срок его действия истек.

Вот как мы получаем токен oAuth:

import eBayApi from '@hendt/ebay-api';

const ebay = new eBayApi({
  appId: '-- or Client ID --',
  certId: '-- or Client Secret',
  sandbox: false,
  siteId: eBayApi.SiteId.EBAY_US,
  ruName: '-- eBay Redirect URL name --' //in this case: Dean_Schmid-DeanSchm-TestAp-kqmgc
});

// This will generate the URL you need to visit
const url = ebay.oAuth2.generateAuthUrl();

// After grant access, eBay will redirect you to RuName page and set the ?code query.
// Grab the ?code and get the token with:
ebay.oAuth2.getToken(code).then((token) => {
  console.log('Token', token);
  ebay.oAuth2.setCredentials(token);

  // Now you can make request to eBay API:
   ebay.buy.browse.getItem('v1|382282567190|651094235351')
    .then(item => {
        console.log(JSON.stringify(item, null, 2));
    })
    .catch(e => {
        console.log(e);
    });
});

Другой пример с областью действия можно найти здесь .

Некоторые подсказки:

  • с помощью "scope" вы сообщаете eBay, что планируете использовать. Описания можно найти здесь , в разделе «Песочница / Коробка производственных ключей». (OAuth Scopes)
  • если вы используете axios, вы можете использовать auth config, поэтому вам не нужно btoa:
axios("https://api.sandbox.ebay.com/identity/v1/oauth2/token", {
  // ...
  auth: {
    username: 'appId',
    password: 'certId'
  }
});
  • Для использования песочницы без https,например, localhost, вы можете настроить перенаправление на сайте https и перенаправить / передать код на сайт, отличный от https.
...