diff --git a/app.js b/app.js index 3669690..2c65afc 100644 --- a/app.js +++ b/app.js @@ -57,6 +57,11 @@ if (process.env.NODE_ENV === 'development') { app.use(morgan('dev')); } +// All +app.all('/*', function (req, res, next) { + res.header('Access-Control-Allow-Origin', '*'); + next(); +}); // routes app.get('/', (req, res) => { diff --git a/config/passport.js b/config/passport.js index 4d385b0..e7e6547 100644 --- a/config/passport.js +++ b/config/passport.js @@ -10,15 +10,18 @@ module.exports = function (passport) { clientID: process.env.GOOGLE_CLIENT_ID, clientSecret: process.env.GOOGLE_CLIENT_SECRET, callbackURL: '/api/v1/auth/google/callback', + proxy: true, }, async (accessToken, refreshToken, profile, done) => { - console.log(profile); + // console.log(profile); + // console.log('email', profile.emails[0].value); const newUser = { googleId: profile.id, displayName: profile.displayName, firstName: profile.name.givenName, lastName: profile.name.familyName, image: profile.photos[0].value, + email: profile.emails[0].value, }; try { diff --git a/controller/auth.js b/controller/auth.js index 3c580b3..f30a867 100644 --- a/controller/auth.js +++ b/controller/auth.js @@ -2,11 +2,18 @@ const passport = require('passport'); const User = require('../models/Users'); const loginUser = async (req, res) => { - res.json('User logged in'); + res.json({ msg: 'User Authenticated', user: req.user }); }; const googleLogin = async (req, res) => { - passport.authenticate('google', { scope: ['profile'] }); + passport.authenticate('google', { scope: ['email', 'profile'] }); +}; + +const googleLoginSuccess = async (req, res) => { + if (!req.user) { + res.status(400).json({ msg: 'User Not Authenticated', user: null }); + } + res.json({ msg: 'User Authenticated', user: req.user }); }; const googleCallback = async (req, res, next) => { @@ -18,9 +25,19 @@ const registerUser = async (req, res) => { res.status(200).json({ user }); }; -const logoutUser = async (req, res) => { - req.logout(); - res.redirect('/'); +const logoutUser = async (req, res, next) => { + req.logout(function (err) { + if (err) { + return next(err); + } + res.redirect('/'); + }); }; -module.exports = { loginUser, logoutUser, registerUser, googleLogin }; +module.exports = { + loginUser, + logoutUser, + registerUser, + googleLogin, + googleLoginSuccess, +}; diff --git a/controller/dashboard.js b/controller/dashboard.js index 7882a92..732729a 100644 --- a/controller/dashboard.js +++ b/controller/dashboard.js @@ -1,4 +1,8 @@ const dashboard = async (req, res) => { + if (!req.user) { + res.status(400).json({ msg: 'User Not Authenticated', user: null }); + } + res.json({ msg: 'User Authenticated', user: req.user }); res.send('Dashboard'); }; diff --git a/package-lock.json b/package-lock.json index fd6475b..12b0b62 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,7 @@ "morgan": "^1.10.0", "passport": "^0.6.0", "passport-google-oauth20": "^2.0.0", + "passport-twitter-oauth2": "^2.1.1", "rate-limiter": "^0.2.0", "xss-clean": "^0.1.1" }, @@ -1931,6 +1932,18 @@ "node": ">= 0.4.0" } }, + "node_modules/passport-twitter-oauth2": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/passport-twitter-oauth2/-/passport-twitter-oauth2-2.1.1.tgz", + "integrity": "sha512-wkJLfsms4xIS5MO9IK243rJI9cASJBma9CYJAnVf0alj4blp/wykeQrr0i0HgBwrtAiJUN/nqx3P9rzwS5ytAQ==", + "dependencies": { + "passport-oauth2": "1.x.x", + "xtraverse": "0.1.x" + }, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -2681,6 +2694,15 @@ "node": ">=8" } }, + "node_modules/xmldom": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", + "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==", + "deprecated": "Deprecated due to CVE-2021-21366 resolved in 0.5.0", + "engines": { + "node": ">=0.1" + } + }, "node_modules/xss-clean": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/xss-clean/-/xss-clean-0.1.1.tgz", @@ -2694,6 +2716,17 @@ "resolved": "https://registry.npmjs.org/xss-filters/-/xss-filters-1.2.6.tgz", "integrity": "sha512-uqgwZRpVJCDfHsRX9lDrkPyCitQYzPklmLSbajJncATZKAUd1tF1x9y2VyPNFMv8SsSWed80xorSS5qGpw3WiA==" }, + "node_modules/xtraverse": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/xtraverse/-/xtraverse-0.1.0.tgz", + "integrity": "sha512-MANQdlG2hl1nQobxz1Rv8hsS1RuBS0C1N6qTOupv+9vmfrReePdxhmB2ecYjvsp4stJ80HD7erjkoF1Hd/FK9A==", + "dependencies": { + "xmldom": "0.1.x" + }, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -4132,6 +4165,15 @@ "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==" }, + "passport-twitter-oauth2": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/passport-twitter-oauth2/-/passport-twitter-oauth2-2.1.1.tgz", + "integrity": "sha512-wkJLfsms4xIS5MO9IK243rJI9cASJBma9CYJAnVf0alj4blp/wykeQrr0i0HgBwrtAiJUN/nqx3P9rzwS5ytAQ==", + "requires": { + "passport-oauth2": "1.x.x", + "xtraverse": "0.1.x" + } + }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -4693,6 +4735,11 @@ "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", "dev": true }, + "xmldom": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", + "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==" + }, "xss-clean": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/xss-clean/-/xss-clean-0.1.1.tgz", @@ -4706,6 +4753,14 @@ "resolved": "https://registry.npmjs.org/xss-filters/-/xss-filters-1.2.6.tgz", "integrity": "sha512-uqgwZRpVJCDfHsRX9lDrkPyCitQYzPklmLSbajJncATZKAUd1tF1x9y2VyPNFMv8SsSWed80xorSS5qGpw3WiA==" }, + "xtraverse": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/xtraverse/-/xtraverse-0.1.0.tgz", + "integrity": "sha512-MANQdlG2hl1nQobxz1Rv8hsS1RuBS0C1N6qTOupv+9vmfrReePdxhmB2ecYjvsp4stJ80HD7erjkoF1Hd/FK9A==", + "requires": { + "xmldom": "0.1.x" + } + }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", diff --git a/package.json b/package.json index 1d237f8..4ffc656 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "morgan": "^1.10.0", "passport": "^0.6.0", "passport-google-oauth20": "^2.0.0", + "passport-twitter-oauth2": "^2.1.1", "rate-limiter": "^0.2.0", "xss-clean": "^0.1.1" }, diff --git a/routes/auth.js b/routes/auth.js index 16aa617..4ddc6c7 100644 --- a/routes/auth.js +++ b/routes/auth.js @@ -1,10 +1,17 @@ const express = require('express'); const router = express.Router(); const passport = require('passport'); -const { loginUser, registerUser, logoutUser } = require('../controller/auth'); +const { + loginUser, + registerUser, + logoutUser, + googleLoginSuccess, +} = require('../controller/auth'); const { ensureGuest } = require('../middleware/authentication'); router.route('/login').get(ensureGuest, loginUser); +router.route('/login/success').get(googleLoginSuccess); + router.route('/register').post(registerUser); // @desc Auth with Google @@ -12,16 +19,22 @@ router.route('/register').post(registerUser); router .route('/google') - .get(passport.authenticate('google', { scope: ['profile'] })); -router - .route('/google/callback') .get( - passport.authenticate('google', { failureRedirect: '/' }), - (req, res) => { - res.redirect('/api/v1/dashboard'); - } + passport.authenticate('google', { scope: ['openid ', 'email', 'profile'] }) ); +router.route('/google/callback').get( + passport.authenticate('google', { + failureRedirect: '/', + // successRedirect: '/dashboard', + }), + async (req, res) => { + res.redirect('http://localhost:3000/dashboard'); + + res.status(200).json(req.user).then(); + } +); + //@desc logout user // @route /auth/logout