Files
anonymous_github/routes/connection.js
tdurieux a2d0f0b212 v2 wip
2021-03-16 11:23:16 +01:00

103 lines
2.2 KiB
JavaScript

const redis = require("redis");
const passport = require("passport");
const session = require("express-session");
const redisStore = require("connect-redis")(session);
const GitHubStrategy = require("passport-github2").Strategy;
const express = require("express");
const router = express.Router();
const db = require("../utils/database");
const config = require("../config");
function ensureAuthenticated(req, res, next) {
if (req.isAuthenticated()) {
return next();
}
res.status(401).json({ error: "not_connected" });
}
passport.serializeUser(function(user, done) {
delete user.profile._json;
done(null, user);
});
passport.deserializeUser(function(obj, done) {
done(null, obj);
});
passport.use(
new GitHubStrategy(
{
clientID: config.CLIENT_ID,
clientSecret: config.CLIENT_SECRET,
callbackURL: config.AUTH_CALLBACK,
},
async (accessToken, refreshToken, profile, done) => {
try {
await db
.get()
.collection("users")
.updateOne(
{ username: profile.username },
{
$set: {
username: profile.username,
profile,
accessToken,
refreshToken,
},
},
{ upsert: true }
);
} catch (error) {
console.error(error);
} finally {
done(null, {
username: profile.username,
accessToken,
refreshToken,
profile,
});
}
}
)
);
const rediscli = redis.createClient({
host: "redis",
ttl: 260,
});
const appSession = session({
secret: "keyboard cat",
store: new redisStore({
client: rediscli,
}),
saveUninitialized: false,
resave: false,
});
router.get(
"/login",
passport.authenticate("github", { scope: ["repo"] }), // Note the scope here
function(req, res) {
res.redirect("/");
}
);
router.get(
"/auth",
passport.authenticate("github", { failureRedirect: "/" }),
function(req, res) {
res.redirect("/");
}
);
module.exports.ensureAuthenticated = ensureAuthenticated;
module.exports.passport = passport;
module.exports.session = appSession;
module.exports.router = router;