Keine Beschreibung

passport.js 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. var co = require('co');
  2. var crypto = require('crypto');
  3. var LocalStrategy = require('passport-local').Strategy;
  4. var GithubStrategy = require('passport-github2').Strategy;
  5. var FacebookStrategy = require('passport-facebook').Strategy;
  6. var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;
  7. var LinkedinStrategy = require('passport-linkedin-oauth2').Strategy;
  8. var Utils = require('./utils');
  9. var Member = require('./member');
  10. // Loading settings
  11. var settings = require('./config.js');
  12. if (!settings) {
  13. console.error('Failed to load settings');
  14. return;
  15. }
  16. var protocol = settings.general.server.secure ? 'https://' : 'http://';
  17. var port = (settings.general.server.port == 80) ? '' : ':' + settings.general.server.port;
  18. module.exports = {
  19. init: function(passport) {
  20. passport.serializeUser(function(user, done) {
  21. done(null, user);
  22. })
  23. passport.deserializeUser(function(user, done) {
  24. done(null, user);
  25. })
  26. },
  27. local: function(passport) {
  28. passport.use(new LocalStrategy(function(username, password, done) {
  29. co(function *() {
  30. // Using own library to authorize
  31. return yield Member.authorizeMember(username, password);
  32. }).then(function(member) {
  33. done(null, member);
  34. }, function(err) {
  35. done(err);
  36. });
  37. }));
  38. },
  39. github: function(passport) {
  40. passport.use(new GithubStrategy({
  41. clientID: settings.general.authorization.github.clientID,
  42. clientSecret: settings.general.authorization.github.clientSecret,
  43. callbackURL: Utils.getExternalUrl() + '/auth/github/callback'
  44. },
  45. function(accessToken, refreshToken, profile, done) {
  46. var user = {
  47. name: profile.displayName,
  48. email: profile.emails[0].value
  49. };
  50. done(null, user);
  51. }
  52. ));
  53. },
  54. facebook: function(passport) {
  55. passport.use(new FacebookStrategy({
  56. clientID: settings.general.authorization.facebook.clientID,
  57. clientSecret: settings.general.authorization.facebook.clientSecret,
  58. callbackURL: Utils.getExternalUrl() + '/auth/facebook/callback',
  59. profileFields: [ 'displayName', 'emails' ],
  60. enableProof: false
  61. },
  62. function(accessToken, refreshToken, profile, done) {
  63. var user = {
  64. name: profile.displayName,
  65. email: profile.emails[0].value
  66. };
  67. done(null, user);
  68. }
  69. ));
  70. },
  71. google: function(passport) {
  72. passport.use(new GoogleStrategy({
  73. clientID: settings.general.authorization.google.clientID,
  74. clientSecret: settings.general.authorization.google.clientSecret,
  75. callbackURL: Utils.getExternalUrl() + '/auth/google/callback'
  76. },
  77. function(accessToken, refreshToken, profile, done) {
  78. var user = {
  79. name: profile.displayName,
  80. email: profile.emails[0].value
  81. };
  82. done(null, user);
  83. }
  84. ));
  85. },
  86. linkedin: function(passport) {
  87. passport.use(new LinkedinStrategy({
  88. clientID: settings.general.authorization.linkedin.clientID,
  89. clientSecret: settings.general.authorization.linkedin.clientSecret,
  90. callbackURL: Utils.getExternalUrl() + '/auth/linkedin/callback',
  91. scope: [ 'r_emailaddress', 'r_basicprofile' ],
  92. state: true
  93. },
  94. function(accessToken, refreshToken, profile, done) {
  95. var user = {
  96. name: profile.displayName,
  97. email: profile.emails[0].value
  98. };
  99. done(null, user);
  100. }
  101. ));
  102. },
  103. login: function(ctx, user) {
  104. return function(done) {
  105. co(function *() {
  106. var member = {
  107. id: user.id,
  108. name: user.name,
  109. email: user.email,
  110. login_time: Date.now(),
  111. avatar_hash: crypto.createHash('md5').update(user.email).digest('hex')
  112. }
  113. // User information will be stored in session
  114. yield ctx.login(member);
  115. done(null, member);
  116. });
  117. };
  118. }
  119. };