Ошибка API 23andMe: "Нет предоставленного grant_type". 'invalid_request' OAuth2

Я аутентифицируюсь с помощью API 23andMe с OAuth 2. Я могу получить код после того, как пользователь предоставляет доступ. В настоящее время я пытаюсь отправить запрос на отправку, чтобы получить токен доступа. Я продолжаю получать эту ошибку:

 data: 
    { error_description: 'No grant_type provided.',
      error: 'invalid_request' } }

Я использую пакет axios для отправки моего запроса на отправку. В моем запросе есть ошибка, потому что я получил успешный ответ 200 и токен доступа, когда я cuRL:

 curl https://api.23andme.com/token/
      -d client_id='zzz' \
      -d client_secret='zzz' \
      -d grant_type='authorization_code' \
      -d code=zzz \
      -d "redirect_uri=http://localhost:3000/receive_code/"
      -d "scope=basic%20rszzz"

Я могу получить код авторизации с сервера 23andMe. Затем меня перенаправляют на мое приложение. Здесь мой маршрут GET:

router.get('/receive_code', function(req, res) {

 axios.post('https://api.23andme.com/token/', {

  client_id: zzz,
  client_secret: zzz, 
  grant_type: 'authorization_code',
  code: req.query.code,
  redirect_uri: 'http://localhost:3000/receive_code/',
  scope: "basic%20rs3094315"

  }).then(function (response) {
    console.log(response);

  }).catch(function (error) {
    console.log(error);
 });
});

Любые мысли?

3
задан vincentjp 05 авг. '16 в 7:16
источник поделиться
2 ответов

Я смог решить проблему, используя пакет simple-oauth2 npm. Его можно найти здесь: https://www.npmjs.com/package/simple-oauth2#express-and-github-example

 // **********23ANDME OAUTH2************
 var oauth2 = require('simple-oauth2')({
  clientID: 'zzz',
  clientSecret: 'zzz',
  site: 'https://api.23andme.com',
  tokenPath: '/token',
  authorizationPath: '/authorize'
 });

 var authorization_uri = oauth2.authCode.authorizeURL({
  redirect_uri: 'http://localhost:3000/receive_code/',
  scope: 'basic  analyses rs1234567',
  state: 'jenvuece2a'
 });
 // *************************************

// In you view, place "/auth" in your <a> e.g. <a href="/auth">Click Me</a>
router.get('/auth', function (req, res) {

 res.redirect(authorization_uri);

});

router.get('/receive_code', function(req, res) {

 var code = req.query.code;

 if (!code) {
  res.send('Error!!')
 } else {
 console.log('running');

  oauth2.authCode.getToken({
    code: code,
    redirect_uri: 'http://localhost:3000/receive_code/'
  }, saveToken);

  function saveToken(error, result) {
    if (error) { 
      console.log('Access Token Error', error.message); 
    } else {
      token = oauth2.accessToken.create(result);
      console.log(token);
    }

  };

  res.render('/genetic_report', {layout: 'dash'});

 }
});
0
ответ дан vincentjp 10 авг. '16 в 1:17
источник поделиться

Проблема заключается в ключе form, который вы разместили в своей полезной нагрузке. Он должен работать следующим образом:

axios.post('https://api.23andme.com/token/', {
  client_id: zzz,
  client_secret: zzz, 
  grant_type: 'authorization_code',
  code: req.query.code
  redirect_uri: 'http://localhost:3000/receive_code/',
  scope: "basic%20rs3094315"
}).then(function (response) {
  console.log(response);
}).catch(function (error) {
  console.log(error);
});
0
ответ дан Joel A. Villarreal Bertoldi 08 авг. '16 в 7:47
источник поделиться

Другие вопросы по меткам