index.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. var passport = require('passport');
  2. var GitHubStrategy = require('passport-github').Strategy;
  3. var LocalStrategy = require('passport-local').Strategy;
  4. var r = require('../db');
  5. var bcrypt = require('bcryptjs');
  6. passport.serializeUser(function (user, done) {
  7. return done(null, user.id);
  8. });
  9. passport.deserializeUser(function (id, done) {
  10. r
  11. .table('users')
  12. .get(id)
  13. .run(r.conn)
  14. .then(function (user) {
  15. delete user.password;
  16. done(null, user);
  17. });
  18. });
  19. var loginCallbackHandler = function (objectMapper, type) {
  20. return function (arg1, arg2, arg3, arg4) {
  21. /*
  22. * If the type is github
  23. * arg1 is the accessToken
  24. * arg2 is the refresh token
  25. * arg3 is profile object
  26. * arg4 is done callback
  27. *
  28. * if the type is local
  29. * arg1 is username
  30. * arg2 is password
  31. * arg3 is done callback
  32. * */
  33. var username, done;
  34. if (type === "github") {
  35. username = arg3.username;
  36. done = arg4;
  37. } else {
  38. username = arg1;
  39. done = arg3;
  40. }
  41. if (arg1 !== null) {
  42. r
  43. .table('users')
  44. .getAll(username.toLowerCase(), { index: 'usernameL' })
  45. .run(r.conn)
  46. .then(function (cursor) {
  47. return cursor.toArray()
  48. .then(function (users) {
  49. if (users.length > 0) {
  50. var userType = users[0].type;
  51. if (userType === "github" && type === userType) {
  52. return done(null, users[0]);
  53. } else if (userType === "local" && userType === type) {
  54. var hash = users[0].password;
  55. console.log("Checking password...");
  56. bcrypt.compare(arg2, hash, function(err, isMatch) {
  57. if (err || isMatch === false) {
  58. //Incorrect password/error occured
  59. //TODO Throw error
  60. } else {
  61. var user = users[0];
  62. delete user.password;
  63. return done(null, user);
  64. }
  65. });
  66. } else {
  67. // If this gets called, a user tried to sign in with a GitHub account even though a normal account with that username already exists, or the other way around
  68. if (userType === "local") {
  69. return done(null, false, {message: "This account has been registered via email, not via GitHub."});
  70. } else {
  71. return done(null, false, {message: "This account has been registered via GitHub, not via email."});
  72. }
  73. }
  74. } else if (type === "github") {
  75. return r.table('users')
  76. .insert(objectMapper(arg3))
  77. .run(r.conn)
  78. .then(function (response) {
  79. return r.table('users')
  80. .get(response.generated_keys[0])
  81. .run(r.conn);
  82. })
  83. .then(function (newUser) {
  84. done(null, newUser);
  85. });
  86. } else {
  87. console.log("User not found");
  88. done(null, false, {message: 'Account not found.'});
  89. // TODO Say account not found
  90. }
  91. });
  92. })
  93. .catch(function (err) {
  94. console.log('Error Getting User', err);
  95. });
  96. }
  97. };
  98. };
  99. var callbackURL = 'http://127.0.0.1:3000/auth/login/callback';
  100. // Github
  101. passport.use(new GitHubStrategy({
  102. clientID: "c5516f218aa8682ac67d",
  103. clientSecret: "5a3ee482ab2eb4ade56ab6ea01fd7544dd9a9be9",
  104. callbackURL: callbackURL + '/github'
  105. },
  106. loginCallbackHandler(function (profile) {
  107. return {
  108. 'username': profile.username,
  109. 'usernameL': profile.username.toLowerCase(),
  110. 'name': profile.displayName || undefined,
  111. 'email': 'email',
  112. 'type': 'github'
  113. };
  114. }, 'github')
  115. ));
  116. // Local
  117. passport.use(new LocalStrategy(
  118. {},
  119. loginCallbackHandler(undefined, 'local')
  120. ));
  121. passport.checkIfLoggedIn = function (req, res, next) {
  122. if (req.user) {
  123. return next();
  124. }
  125. return res.status(401).send('You\'re not logged in');
  126. };
  127. module.exports = passport;