googleAuth.js 1.8 KB

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