Я получаю сообщение об ошибке каждый раз, когда вызываю getToken с допустимым authCode. Вот журнал ошибок, напечатанный с помощью кода ниже:
Error getting tokens: invalid_request
Что-то не так с тем, как я использую API? Цените любые указатели...
var express = require('express');
var router = express.Router();
var google = require('googleapis');
var urlshortener = google.urlshortener('v1');
var OAuth2 = google.auth.OAuth2;
var plus = google.plus('v1');
var googleClientInfo = { "web": {...} };
var oauth2 = new OAuth2(googleClientInfo.web.client_id, googleClientInfo.web.client_secret, googleClientInfo.web.redirect_uris);
var scopes = [ 'https://www.googleapis.com/auth/plus.me',
'https://www.googleapis.com/auth/calendar'
];
google.options({ auth: oauth2 }); // set auth as a global default
var authUrl = oauth2.generateAuthUrl( {
access_type: 'offline',
scope: scopes
});
/* GET authCode from Google Server */
router.get('/', function(req, res) {
console.log('Redirecting to URL: ' + JSON.stringify(authUrl));
res.redirect(authUrl);
});
/* '/successful' is the redirect_uri with authCode query */
router.get('/successful', function(req, res) {
console.log('Got code: ', (req.query.code));
oauth2.getToken(req.query.code, function(err, tokens) {
if(err) {
console.log("Error getting tokens: ", err);
res.redirect('/');
} else {
console.log("Saving tokens: ", JSON.stringify(tokens));
// Save tokens
oauth2.setCredentials(tokens);
plus.people.get({ userId: 'me', auth: oauth2 }, function(err, response) {
if(err) {
console.log("Error getting userId: ", err);
res.redirect('/');
} else {
res.send('Login Successful: ' + JSON.stringify(response));
console.log('Login Successful: ' + JSON.stringify(response));
}
});
}
});
});
module.exports = router;
Обновление: я добавил код ведения журнала в oauth2client.js следующим образом:
/**
* Gets the access token for given code.
* <strong i="6">@param</strong> {string} code The authorization code.
* <strong i="7">@param</strong> {function=} opt_callback Optional callback fn.
*/
OAuth2Client.prototype.getToken = function(code, opt_callback) {
var uri = this.opts.tokenUrl || OAuth2Client.GOOGLE_OAUTH2_TOKEN_URL_;
var values = {
code: code,
client_id: this.clientId_,
client_secret: this.clientSecret_,
redirect_uri: this.redirectUri_,
grant_type: 'authorization_code'
};
console.log("posting to uri: ", uri + ", with values: " + JSON.stringify(values));
this.transporter.request({
method: 'POST',
uri: uri,
form: values,
json: true
}, opt_callback);
};
Я получаю следующие журналы (я добавил несколько * *, чтобы скрыть информацию о пользователе
posting to uri: https://accounts.google.com/o/oauth2/token, with
values: {"code":"4/U2PMY1Gu6ImEuax57j9an7UoBBFa.or_RbQzmcKYZBrG_bnfDxpJe-8vsjgI",
"client_id":"**********62-srmgmr0i8ck7j4vvi0454ntcfkoufgu1.apps.googleusercontent.com",
"client_secret":"CdhVi3Yk21g_uswaDZafTeNC",
"redirect_uri":["https://*********.herokuapp.com/googleLogin/successful"],
"grant_type":"authorization_code"}
Error getting tokens: invalid_request
Вышеупомянутое выглядит нормально, но тогда почему я получаю обратный вызов с ошибкой, установленной на invalid_request? Может быть, что-то не так с транспортером?
Каково содержимое googleClientInfo.web.redirect_uris
? Это строка? Если это массив, попробуйте вместо этого указать первое значение в массиве, например googleClientInfo.web.redirect_uris[0]
. Если вы получаете действительный authCode, то я не уверен, что это имеет значение.
Возможно, вы могли бы попробовать обмануть с помощью https://developers.google.com/oauthplayground/ и сравнить свои запросы с запросами, которые отправляет ваш код.
Да, это работает! Как вы думаете, это хорошая идея, чтобы выдать ошибку, если URI является массивом? Сэкономил бы время отладки для такой бедняги, как я :). Большое спасибо за помощь. Ваше здоровье.
Самый полезный комментарий
Да, это работает! Как вы думаете, это хорошая идея, чтобы выдать ошибку, если URI является массивом? Сэкономил бы время отладки для такой бедняги, как я :). Большое спасибо за помощь. Ваше здоровье.