Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // router.js
- const passport = require('passport')
- const { verifyGithub } = require('./middleware/github')
- const github = require('./controllers/github')
- const authenticate = passport.authenticate('github', { failureRedirect: '/login' })
- router.get('/authorize', verifyGithub, authenticate)
- router.get('/oauthCallback', verifyGithub, authenticate, github)
- // controllers/github.js
- const randomize = require('randomatic')
- const TokenStorage = Parse.Object.extend('TokenStorage')
- const restrictedAcl = new Parse.ACL()
- restrictedAcl.setPublicReadAccess(false)
- restrictedAcl.setPublicWriteAccess(false)
- const upsertGitHubUser = function(profile) {
- var query = new Parse.Query(TokenStorage)
- query.equalTo('githubId', profile.id)
- query.ascending('createdAt')
- return query.first({ useMasterKey: true }).then(function(tokenData) {
- if (!tokenData) {
- return newGitHubUser(profile)
- }
- const user = tokenData.get('user')
- return user
- .fetch({ useMasterKey: true })
- .then(user => {
- if (profile.accessToken !== tokenData.get('accessToken')) {
- tokenData.set('accessToken', profile.accessToken)
- }
- return tokenData.save(null, { useMasterKey: true }).then(() => user)
- })
- .then(user => {
- const password = randomize('*', 10)
- user.setPassword(password)
- return user.save(null, { useMasterKey: true }).then(user => {
- return Parse.User.logIn(user.get('username'), password)
- })
- })
- .then(user => user)
- })
- }
- const newGitHubUser = function(profile) {
- const user = new Parse.User()
- user.set('username', profile.username)
- user.set('email', profile.email)
- user.set('avatar', profile.photo)
- user.set('password', randomize('*', 10))
- return user
- .signUp()
- .then(function(user) {
- const ts = new TokenStorage()
- ts.set('githubId', profile.id)
- ts.set('githubLogin', profile.username)
- ts.set('accessToken', profile.accessToken)
- ts.set('user', user)
- ts.setACL(restrictedAcl)
- return ts.save(null, { useMasterKey: true })
- })
- .then(() => {
- return upsertGitHubUser(profile)
- })
- }
- function github(req, res) {
- const profile = req.user
- if (!(profile.email && profile.username && profile.id)) {
- res.render('error', { errorMessage: 'Invalid github data' })
- return
- }
- upsertGitHubUser(profile)
- .then(user => {
- res.render('store_auth', { sessionToken: user.getSessionToken() })
- })
- .catch(error => {
- res.render('error', { errorMessage: JSON.stringify(error) })
- })
- }
- module.exports = github
- // middleware/github.js
- const config = require('config')
- const passport = require('passport')
- const GitHubStrategy = require('passport-github').Strategy
- function githubAuth(req, res, next) {
- if (!config.get('verifyGithubAccount')) {
- return next()
- }
- passport.serializeUser(function(user, done) {
- done(null, user)
- })
- passport.deserializeUser(function(user, done) {
- done(null, user)
- })
- passport.use(
- new GitHubStrategy(config.get('github'), function(accessToken, refreshToken, profile, done) {
- profile.accessToken = accessToken
- done(null, profile)
- })
- )
- passport.initialize()(req, res, next)
- }
- function verifyGithub(req, res, next) {
- if (!config.get('verifyGithubAccount')) {
- return next(new Error('Cannot use github account.'))
- }
- next()
- }
- module.exports = { githubAuth, verifyGithub }
- // config.js
- module.exports = {
- github: {
- clientID: undefined,
- clientSecret: undefined,
- callbackURL: undefined
- }
- }
Add Comment
Please, Sign In to add comment