我正在使用带有OAuth 2的23andMe API进行身份验证。我可以在用户授予访问权限后收到代码。我目前正在尝试发送邮件请求以接收访问令牌。我继续收到此错误:
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);
});
});
有什么想法?
答案 0 :(得分: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); });
答案 1 :(得分: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'});
}
});