Skip to content

Instantly share code, notes, and snippets.

@bertrandmartel
Last active June 8, 2020 21:28
Show Gist options
  • Save bertrandmartel/35b4a063d8b75fc1b50f23863c4a7c75 to your computer and use it in GitHub Desktop.
Save bertrandmartel/35b4a063d8b75fc1b50f23863c4a7c75 to your computer and use it in GitHub Desktop.
passport-github with octonode and mongodb example
var app = require('express')(),
passport = require('passport'),
GitHubStrategy = require('passport-github').Strategy,
mongoose = require('mongoose'),
github = require('octonode'),
session = require('express-session');
var config = {
clientID: 'CLIENT_ID',
clientSecret: 'CLIENT_SECRET',
callbackURL: 'http://localhost:8080/auth/github/callback'
};
var db = mongoose.connect("mongodb://localhost:27017/testDB");
var userSchema = new mongoose.Schema({
id: { type: String, unique: true },
access_token: String,
refresh_token: String,
name: String
}, { collection: "user" });
var User = mongoose.model('User', userSchema);
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findOne({ "id": id }, function(err, user) {
done(err, user);
});
});
passport.use(new GitHubStrategy({
clientID: config.clientID,
clientSecret: config.clientSecret,
callbackURL: config.callbackURL
},
function(accessToken, refreshToken, profile, done) {
process.nextTick(function() {
User.findOne({ id: profile.id }, function(err, res) {
if (err)
return done(err);
if (res) {
console.log("user exists");
return done(null, res);
} else {
console.log("insert user");
var user = new User({
id: profile.id,
access_token: accessToken,
refresh_token: refreshToken
});
user.save(function(err) {
if (err)
return done(err);
return done(null, user);
});
}
})
});
}
));
function userLogged(req, res, next) {
if (req.isAuthenticated())
return next();
res.redirect('/auth/github');
}
app.use(session({ secret: 'somesecret' }));
app.use(passport.initialize());
app.use(passport.session());
app.get('/auth/github', passport.authenticate('github'));
app.get('/auth/github/callback',
passport.authenticate('github', {
successRedirect: '/profile',
failureRedirect: '/',
scope: ['user']
}));
app.get('/profile', userLogged, function(req, res) {
var client = github.client(req.user.access_token);
var ghme = client.me();
ghme.repos((err, repos) => {
if (err) {
console.log(err);
res.json({
status: "error"
});
} else {
console.log(repos);
res.json({
status: "ok",
data: repos
});
}
});
});
app.listen(8080)
console.log('go to http://localhost:8080/auth/github')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment