googleAuth.js 1.8 KB

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