рд╣рд░ рдмрд╛рд░ рдЬрдм рдореИрдВ getToken рдХреЛ рд╡реИрдз рдСрдердХреЛрдб рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореБрджреНрд░рд┐рдд рддреНрд░реБрдЯрд┐ рд▓реЙрдЧ рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
Error getting tokens: invalid_request
рдХреНрдпрд╛ рдореИрдВ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЙрд╕рдореЗрдВ рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рд╣реИ? рдХрд┐рд╕реА рднреА рд╕рдВрдХреЗрдд рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░реЗрдВ ...
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
рдЙрдкрд░реЛрдХреНрдд рдареАрдХ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореБрдЭреЗ рдЧрд▓рдд_рд░реЗрдХреНрд╡реЗрд╕реНрдЯ рдкрд░ рдЧрд▓рдд рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдХреЙрд▓рдмреИрдХ рдХреНрдпреЛрдВ рдорд┐рд▓рддрд╛ рд╣реИ? рд╢рд╛рдпрдж рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯрд░ рдореЗрдВ рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рд╣реИ?
googleClientInfo.web.redirect_uris
рдХреА рд╕рд╛рдордЧреНрд░реА рдХреНрдпрд╛ рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ? рдпрджрд┐ рдпрд╣ рдПрдХ рдРрд░реЗ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп googleClientInfo.web.redirect_uris[0]
рдХреА рддрд░рд╣ рд╕рд░рдгреА рдореЗрдВ рдкрд╣рд▓рд╛ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдЕрдЧрд░ рдЖрдкрдХреЛ рдПрдХ рд╡реИрдз рдСрдердХреЛрдб рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдкрдбрд╝реЗрдЧрд╛ред
рд╢рд╛рдпрдж рдЖрдк https://developers.google.com/oauthplayground/ рдХреЗ рд╕рд╛рде рдмреЗрд╡рдХреВрдл рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рддреБрд▓рдирд╛ рдЖрдкрдХреЗ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рднреЗрдЬреЗ рдЬрд╛ рд░рд╣реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рд╛рдБ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпреВрдЖрд░рдЖрдИ рдПрдХ рд╕рд░рдгреА рд╣реИ рддреЛ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ? рдореЗрд░реЗ рдЬреИрд╕реА рдЧрд░реАрдм рдЖрддреНрдорд╛ рдХреЗ рд▓рд┐рдП рдбрд┐рдмрдЧ рд╕рдордп рдмрдЪрд╛рдПрдЧрд╛ :)ред рдЖрдкрдХреА рдорджрдж рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рдЪреАрдпрд░реНрд╕ред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рд╣рд╛рдБ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпреВрдЖрд░рдЖрдИ рдПрдХ рд╕рд░рдгреА рд╣реИ рддреЛ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ? рдореЗрд░реЗ рдЬреИрд╕реА рдЧрд░реАрдм рдЖрддреНрдорд╛ рдХреЗ рд▓рд┐рдП рдбрд┐рдмрдЧ рд╕рдордп рдмрдЪрд╛рдПрдЧрд╛ :)ред рдЖрдкрдХреА рдорджрдж рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рдЪреАрдпрд░реНрд╕ред