2016-08-05 69 views
3

我使用OAuth 2的23andMe API进行身份验证。我可以在用户授予访问权限后接收代码。我目前正在尝试发送邮件请求以接收访问令牌。我继续收到此错误:23andMe API错误:'没有提供grant_type。' 'invalid_request'OAuth2

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

我正在使用axios包来提出我的发布请求。有一个在我的请求的错误,因为我得到了一个成功的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); 
}); 
}); 

有什么想法?

回答

0

问题在于您放置在有效负载中的密钥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

我提出建议的更改。错误仍在继续。 – vincentjp

+0

同样的错误@vincentjp?看看[这个回购](http://github.com/joelalejandro/genocog-api),我已经实现了一些东西连接到23andme。不过,建议他们在演示配置文件中遇到问题,所以也许一些API调用可能根本不起作用。 –

0

我能通过使用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'}); 

} 
}); 
相关问题