Skip to content

Instantly share code, notes, and snippets.

@olegpolyakov
Created May 7, 2020 18:54
Show Gist options
  • Save olegpolyakov/71a1608e4bbffca45f7b149371b94bc8 to your computer and use it in GitHub Desktop.
Save olegpolyakov/71a1608e4bbffca45f7b149371b94bc8 to your computer and use it in GitHub Desktop.
Express GitHub Auth
import express from 'express';
import request from 'request';
export default ({
config: {
GITHUB_CLIENT_ID,
GITHUB_CLIENT_SECRET,
GITHUB_REDIRECT_URI
},
models: { User }
}) => {
const router = express.Router();
router.use((req, res, next) => {
if (!req.session.userId) return next();
User.findById(req.session.userId).then(user => {
req.user = user;
res.locals.user = user;
next();
});
});
router.get('/login', (req, res) => {
res.redirect(`https://github.com/login/oauth/authorize?client_id=${GITHUB_CLIENT_ID}&redirect_uri=${GITHUB_REDIRECT_URI}&scope=read:user%20user:email`);
});
router.get('/login/github', (req, res) => {
const code = req.query.code;
request({
method: 'post',
uri: 'https://github.com/login/oauth/access_token',
qs: {
client_id: GITHUB_CLIENT_ID,
client_secret: GITHUB_CLIENT_SECRET,
redirect_uri: GITHUB_REDIRECT_URI,
code
},
headers: {
'Accept': 'application/json'
}
}, (error, response, body) => {
const data = JSON.parse(body);
request({
method: 'get',
uri: 'https://api.github.com/user',
headers: {
'User-Agent': 'olegpolyakov',
'Authorization': `token ${data.access_token}`
}
}, (error, response, body) => {
const data = JSON.parse(body);
User.findOne({ githubId: data.id })
.then(user => {
return user || User.create({
username: data.login,
name: data.name,
email: data.email,
githubId: data.id,
avatarUrl: data.avatar_url,
bio: data.bio
});
})
.then(user => {
req.session.userId = user.id;
res.redirect('/');
})
.catch(error => {
console.log(error)
res.redirect('/');
});
});
});
});
router.get('/logout', (req, res) => {
req.session.userId = undefined;
res.redirect('/');
});
return router;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment