Browse Source

Added GitHub and Slack authentication integrations

NGPixel 8 years ago
parent
commit
9976842e45

+ 4 - 0
app/data.yml

@@ -29,6 +29,10 @@ defaults:
         enabled: false
       facebook:
         enabled: false
+      github:
+        enabled: false
+      slack:
+        enabled: false
     db: mongodb://localhost/wiki
     sessionSecret: null
     admin: null

File diff suppressed because it is too large
+ 0 - 0
assets/css/login.css


+ 10 - 0
config.sample.yml

@@ -68,6 +68,16 @@ auth:
     enabled: false
     clientId: FACEBOOK_APP_ID
     clientSecret: FACEBOOK_APP_SECRET
+  github:
+    enabled: false
+    clientId: GITHUB_CLIENT_ID
+    clientSecret: GITHUB_CLIENT_SECRET
+  slack:
+    enabled: false
+    clientId: SLACK_CLIENT_ID
+    clientSecret: SLACK_CLIENT_SECRET
+  ldap:
+    enabled: false
 
 # ---------------------------------------------------------------------
 # Secret key to use when encrypting sessions

+ 1 - 1
controllers/admin.js

@@ -123,7 +123,7 @@ router.post('/users/create', (req, res) => {
 
   if (!validator.isEmail(nUsr.email)) {
     return res.status(400).json({ msg: 'Invalid email address' })
-  } else if (!validator.isIn(nUsr.provider, ['local', 'google', 'windowslive', 'facebook'])) {
+  } else if (!validator.isIn(nUsr.provider, ['local', 'google', 'windowslive', 'facebook', 'github', 'slack'])) {
     return res.status(400).json({ msg: 'Invalid provider' })
   } else if (nUsr.provider === 'local' && !validator.isLength(nUsr.password, { min: 6 })) {
     return res.status(400).json({ msg: 'Password too short or missing' })

+ 4 - 0
controllers/auth.js

@@ -64,10 +64,14 @@ router.post('/login', bruteforce.prevent, function (req, res, next) {
 router.get('/login/ms', passport.authenticate('windowslive', { scope: ['wl.signin', 'wl.basic', 'wl.emails'] }))
 router.get('/login/google', passport.authenticate('google', { scope: ['profile', 'email'] }))
 router.get('/login/facebook', passport.authenticate('facebook', { scope: ['public_profile', 'email'] }))
+router.get('/login/github', passport.authenticate('github', { scope: ['user:email'] }))
+router.get('/login/slack', passport.authenticate('slack', { scope: ['identity.basic', 'identity.email'] }))
 
 router.get('/login/ms/callback', passport.authenticate('windowslive', { failureRedirect: '/login', successRedirect: '/' }))
 router.get('/login/google/callback', passport.authenticate('google', { failureRedirect: '/login', successRedirect: '/' }))
 router.get('/login/facebook/callback', passport.authenticate('facebook', { failureRedirect: '/login', successRedirect: '/' }))
+router.get('/login/github/callback', passport.authenticate('github', { failureRedirect: '/login', successRedirect: '/' }))
+router.get('/login/slack/callback', passport.authenticate('slack', { failureRedirect: '/login', successRedirect: '/' }))
 
 /**
  * Logout

+ 4 - 2
locales/en/auth.json

@@ -3,6 +3,8 @@
 		"local": "Local",
 		"windowslive": "Microsoft Account",
 		"google": "Google ID",
-		"facebook": "Facebook"
+		"facebook": "Facebook",
+    "github": "GitHub",
+    "slack": "Slack"
 	}
-}
+}

+ 4 - 0
models/user.js

@@ -50,10 +50,14 @@ userSchema.statics.processProfile = (profile) => {
     primaryEmail = (e) ? e.value : _.first(profile.emails).value
   } else if (_.isString(profile.email) && profile.email.length > 5) {
     primaryEmail = profile.email
+  } else if (profile.user && profile.user.email && profile.user.email.length > 5) {
+    primaryEmail = profile.user.email
   } else {
     return Promise.reject(new Error('Invalid User Email'))
   }
 
+  profile.provider = _.lowerCase(profile.provider)
+
   return db.User.findOneAndUpdate({
     email: primaryEmail,
     provider: profile.provider

+ 0 - 3
package.json

@@ -83,10 +83,7 @@
     "multer": "^1.2.1",
     "ora": "^1.1.0",
     "passport": "^0.3.2",
-    "passport-facebook": "^2.1.1",
-    "passport-google-oauth20": "^1.0.0",
     "passport-local": "^1.0.0",
-    "passport-windowslive": "^1.0.2",
     "passport.socketio": "^3.7.0",
     "pm2": "^2.4.0",
     "pug": "^2.0.0-beta11",

+ 12 - 4
views/auth/login.pug

@@ -50,18 +50,26 @@ html
             span Log in using...
           if appconfig.auth.microsoft && appconfig.auth.microsoft.enabled
             button.ms(onclick='window.location.assign("/login/ms")')
-              i.fa.fa-windows
+              i.icon-windows2
               span Microsoft Account
           if appconfig.auth.google && appconfig.auth.google.enabled
             button.google(onclick='window.location.assign("/login/google")')
-              i.fa.fa-google
+              i.icon-google
               span Google ID
           if appconfig.auth.facebook && appconfig.auth.facebook.enabled
             button.facebook(onclick='window.location.assign("/login/facebook")')
-              i.fa.fa-facebook
+              i.icon-facebook
               span Facebook
+          if appconfig.auth.github && appconfig.auth.github.enabled
+            button.github(onclick='window.location.assign("/login/github")')
+              i.icon-github
+              span GitHub
+          if appconfig.auth.slack && appconfig.auth.slack.enabled
+            button.slack(onclick='window.location.assign("/login/slack")')
+              i.icon-slack
+              span Slack
     #copyright
       = t('footer.poweredby') + ' '
       a.icon(href='https://github.com/Requarks/wiki')
         i.icon-github
-      a(href='https://github.com/Requarks/wiki') Requarks Wiki
+      a(href='https://wiki.requarks.io/') Wiki.js

+ 4 - 0
views/modals/admin-createuser.pug

@@ -21,6 +21,10 @@
               option(value='google') Google ID
             if appconfig.auth.facebook.enabled
               option(value='facebook') Facebook
+            if appconfig.auth.github.enabled
+              option(value='github') GitHub
+            if appconfig.auth.slack.enabled
+              option(value='slack') Slack
       section(v-if='provider=="local"')
         label.label Password:
         p.control.is-fullwidth

+ 3 - 1
views/pages/admin/profile.pug

@@ -37,7 +37,9 @@ block adminContent
                 when 'local': i.icon-server
                 when 'windowslive': i.icon-windows2.is-blue
                 when 'google': i.icon-google.is-blue
-                when 'facebook': i.icon-facebook.is-purple
+                when 'facebook': i.icon-facebook.is-indigo
+                when 'github': i.icon-github.is-grey
+                when 'slack': i.icon-slack.is-purple
                 default: i.icon-warning
               = t('auth:providers.' + user.provider)
             label.label Member since

+ 7 - 1
views/pages/admin/users-edit.pug

@@ -34,8 +34,14 @@ block adminContent
                 i.icon-google.is-blue
                 | Google ID
               when 'facebook'
-                i.icon-facebook.is-purple
+                i.icon-facebook.is-indigo
                 | Facebook
+              when 'github'
+                i.icon-github.is-blue-grey
+                | GitHub
+              when 'slack'
+                i.icon-slack.is-purple
+                | Slack
               default: i.icon-warning
           td.is-centered= userMoment(usr.createdAt).format('lll')
           td.is-centered= userMoment(usr.updatedAt).format('lll')

+ 6 - 0
views/pages/admin/users.pug

@@ -43,6 +43,12 @@ block adminContent
                 when 'facebook'
                   i.icon-facebook.is-purple
                   | Facebook
+                when 'github'
+                  i.icon-github.is-blue-grey
+                  | GitHub
+                when 'slack'
+                  i.icon-slack.is-purple
+                  | Slack
                 default: i.icon-warning
             td.is-centered= userMoment(usr.createdAt).format('lll')
             td.is-centered= userMoment(usr.updatedAt).format('lll')

Some files were not shown because too many files changed in this diff