Commit 9976842e authored by NGPixel's avatar NGPixel

Added GitHub and Slack authentication integrations

parent ee16b82f
...@@ -29,6 +29,10 @@ defaults: ...@@ -29,6 +29,10 @@ defaults:
enabled: false enabled: false
facebook: facebook:
enabled: false enabled: false
github:
enabled: false
slack:
enabled: false
db: mongodb://localhost/wiki db: mongodb://localhost/wiki
sessionSecret: null sessionSecret: null
admin: null admin: null
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -68,6 +68,16 @@ auth: ...@@ -68,6 +68,16 @@ auth:
enabled: false enabled: false
clientId: FACEBOOK_APP_ID clientId: FACEBOOK_APP_ID
clientSecret: FACEBOOK_APP_SECRET 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 # Secret key to use when encrypting sessions
......
...@@ -123,7 +123,7 @@ router.post('/users/create', (req, res) => { ...@@ -123,7 +123,7 @@ router.post('/users/create', (req, res) => {
if (!validator.isEmail(nUsr.email)) { if (!validator.isEmail(nUsr.email)) {
return res.status(400).json({ msg: 'Invalid email address' }) 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' }) return res.status(400).json({ msg: 'Invalid provider' })
} else if (nUsr.provider === 'local' && !validator.isLength(nUsr.password, { min: 6 })) { } else if (nUsr.provider === 'local' && !validator.isLength(nUsr.password, { min: 6 })) {
return res.status(400).json({ msg: 'Password too short or missing' }) return res.status(400).json({ msg: 'Password too short or missing' })
......
...@@ -64,10 +64,14 @@ router.post('/login', bruteforce.prevent, function (req, res, next) { ...@@ -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/ms', passport.authenticate('windowslive', { scope: ['wl.signin', 'wl.basic', 'wl.emails'] }))
router.get('/login/google', passport.authenticate('google', { scope: ['profile', 'email'] })) router.get('/login/google', passport.authenticate('google', { scope: ['profile', 'email'] }))
router.get('/login/facebook', passport.authenticate('facebook', { scope: ['public_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/ms/callback', passport.authenticate('windowslive', { failureRedirect: '/login', successRedirect: '/' }))
router.get('/login/google/callback', passport.authenticate('google', { 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/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 * Logout
......
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
"local": "Local", "local": "Local",
"windowslive": "Microsoft Account", "windowslive": "Microsoft Account",
"google": "Google ID", "google": "Google ID",
"facebook": "Facebook" "facebook": "Facebook",
"github": "GitHub",
"slack": "Slack"
} }
} }
...@@ -50,10 +50,14 @@ userSchema.statics.processProfile = (profile) => { ...@@ -50,10 +50,14 @@ userSchema.statics.processProfile = (profile) => {
primaryEmail = (e) ? e.value : _.first(profile.emails).value primaryEmail = (e) ? e.value : _.first(profile.emails).value
} else if (_.isString(profile.email) && profile.email.length > 5) { } else if (_.isString(profile.email) && profile.email.length > 5) {
primaryEmail = profile.email primaryEmail = profile.email
} else if (profile.user && profile.user.email && profile.user.email.length > 5) {
primaryEmail = profile.user.email
} else { } else {
return Promise.reject(new Error('Invalid User Email')) return Promise.reject(new Error('Invalid User Email'))
} }
profile.provider = _.lowerCase(profile.provider)
return db.User.findOneAndUpdate({ return db.User.findOneAndUpdate({
email: primaryEmail, email: primaryEmail,
provider: profile.provider provider: profile.provider
......
...@@ -83,10 +83,7 @@ ...@@ -83,10 +83,7 @@
"multer": "^1.2.1", "multer": "^1.2.1",
"ora": "^1.1.0", "ora": "^1.1.0",
"passport": "^0.3.2", "passport": "^0.3.2",
"passport-facebook": "^2.1.1",
"passport-google-oauth20": "^1.0.0",
"passport-local": "^1.0.0", "passport-local": "^1.0.0",
"passport-windowslive": "^1.0.2",
"passport.socketio": "^3.7.0", "passport.socketio": "^3.7.0",
"pm2": "^2.4.0", "pm2": "^2.4.0",
"pug": "^2.0.0-beta11", "pug": "^2.0.0-beta11",
......
...@@ -50,18 +50,26 @@ html ...@@ -50,18 +50,26 @@ html
span Log in using... span Log in using...
if appconfig.auth.microsoft && appconfig.auth.microsoft.enabled if appconfig.auth.microsoft && appconfig.auth.microsoft.enabled
button.ms(onclick='window.location.assign("/login/ms")') button.ms(onclick='window.location.assign("/login/ms")')
i.fa.fa-windows i.icon-windows2
span Microsoft Account span Microsoft Account
if appconfig.auth.google && appconfig.auth.google.enabled if appconfig.auth.google && appconfig.auth.google.enabled
button.google(onclick='window.location.assign("/login/google")') button.google(onclick='window.location.assign("/login/google")')
i.fa.fa-google i.icon-google
span Google ID span Google ID
if appconfig.auth.facebook && appconfig.auth.facebook.enabled if appconfig.auth.facebook && appconfig.auth.facebook.enabled
button.facebook(onclick='window.location.assign("/login/facebook")') button.facebook(onclick='window.location.assign("/login/facebook")')
i.fa.fa-facebook i.icon-facebook
span 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 #copyright
= t('footer.poweredby') + ' ' = t('footer.poweredby') + ' '
a.icon(href='https://github.com/Requarks/wiki') a.icon(href='https://github.com/Requarks/wiki')
i.icon-github i.icon-github
a(href='https://github.com/Requarks/wiki') Requarks Wiki a(href='https://wiki.requarks.io/') Wiki.js
...@@ -21,6 +21,10 @@ ...@@ -21,6 +21,10 @@
option(value='google') Google ID option(value='google') Google ID
if appconfig.auth.facebook.enabled if appconfig.auth.facebook.enabled
option(value='facebook') Facebook 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"') section(v-if='provider=="local"')
label.label Password: label.label Password:
p.control.is-fullwidth p.control.is-fullwidth
......
...@@ -37,7 +37,9 @@ block adminContent ...@@ -37,7 +37,9 @@ block adminContent
when 'local': i.icon-server when 'local': i.icon-server
when 'windowslive': i.icon-windows2.is-blue when 'windowslive': i.icon-windows2.is-blue
when 'google': i.icon-google.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 default: i.icon-warning
= t('auth:providers.' + user.provider) = t('auth:providers.' + user.provider)
label.label Member since label.label Member since
......
...@@ -34,8 +34,14 @@ block adminContent ...@@ -34,8 +34,14 @@ block adminContent
i.icon-google.is-blue i.icon-google.is-blue
| Google ID | Google ID
when 'facebook' when 'facebook'
i.icon-facebook.is-purple i.icon-facebook.is-indigo
| Facebook | Facebook
when 'github'
i.icon-github.is-blue-grey
| GitHub
when 'slack'
i.icon-slack.is-purple
| Slack
default: i.icon-warning default: i.icon-warning
td.is-centered= userMoment(usr.createdAt).format('lll') td.is-centered= userMoment(usr.createdAt).format('lll')
td.is-centered= userMoment(usr.updatedAt).format('lll') td.is-centered= userMoment(usr.updatedAt).format('lll')
......
...@@ -43,6 +43,12 @@ block adminContent ...@@ -43,6 +43,12 @@ block adminContent
when 'facebook' when 'facebook'
i.icon-facebook.is-purple i.icon-facebook.is-purple
| Facebook | Facebook
when 'github'
i.icon-github.is-blue-grey
| GitHub
when 'slack'
i.icon-slack.is-purple
| Slack
default: i.icon-warning default: i.icon-warning
td.is-centered= userMoment(usr.createdAt).format('lll') td.is-centered= userMoment(usr.createdAt).format('lll')
td.is-centered= userMoment(usr.updatedAt).format('lll') td.is-centered= userMoment(usr.updatedAt).format('lll')
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment