googleAuth.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /**
  2. * googleAuth utility
  3. */
  4. 'use strict';
  5. var googleapis = require('googleapis');
  6. var config = require('config');
  7. function createOauth2Client(url) {
  8. return new googleapis.auth.OAuth2Client(
  9. config.google.clientId,
  10. config.google.clientSecret,
  11. url
  12. );
  13. }
  14. module.exports = {
  15. createAuthUrl: function(req, callback) {
  16. var callbackUrl = req.baseUrl + '/google/callback';
  17. var google = createOauth2Client(callbackUrl);
  18. var redirectUrl = google.generateAuthUrl({
  19. access_type: 'offline',
  20. scope: 'https://www.googleapis.com/auth/userinfo.email',
  21. });
  22. callback(null, redirectUrl);
  23. },
  24. handleCallback: function(req, callback) {
  25. var callbackUrl = req.baseUrl + '/google/callback';
  26. var google = createOauth2Client(callbackUrl);
  27. var code = req.session.googleAuthCode || null;
  28. if (!code) {
  29. return callback(new Error('No code exists.'), null);
  30. }
  31. google.getToken(code, function(err, tokens) {
  32. console.log('getToken', err, tokens);
  33. if (err) {
  34. return callback(new Error('[googleAuth.handleCallback] Error to get token.'), null);
  35. }
  36. googleapis.discover('oauth2', 'v1').withOpts({cache: { path: __dirname + '/../tmp/googlecache'}}).execute(function(err, client) {
  37. if (err) {
  38. return callback(new Error('[googleAuth.handleCallback] Failed to discover oauth2 API endpoint.'), null);
  39. }
  40. var tokeninfo = client.oauth2.tokeninfo({id_token: tokens.id_token});
  41. tokeninfo.execute(function(err, response) {
  42. if (err) {
  43. return callback(new Error('[googleAuth.handleCallback] Error while proceccing tokeninfo.'), null);
  44. }
  45. return callback(null, response);
  46. });
  47. });
  48. });
  49. }
  50. };