23andMe API 错误:"无grant_type provided.invalid_request"OAuth2



我正在使用OAuth 2使用23andMe API进行身份验证。我可以在用户授予访问权限后接收代码。我目前正在尝试发送一个post请求以接收访问令牌。我继续收到这个错误:

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

我正在使用axios软件包来提出我的帖子请求。我的请求中有一个错误,因为我在cuRL:时获得了成功的200响应和访问令牌

 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);
 });
});

有什么想法吗?

问题在于您放置在有效负载中的form密钥。它应该这样工作:

axios.post('https://api.23andme.com/token/'{client_id:zzz,client_secret:zzz,grant_type:"authorization_code",代码:req.query.coderedirect_uri:'http://localhost:3000/receive_code/',作用域:"基本%20rs3094315"}).然后(函数(响应({console.log(响应(;}).catch(函数(错误({console.log(错误(;});

我能够通过使用simple-oauth2-npm包来解决这个问题。它可以在这里找到:https://www.npmjs.com/package/simple-oauth2#express-和github示例

 // **********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'});
 }
});

相关内容

最新更新