From a8d934fdae5289ce4fa3edc386d569012a02e6e5 Mon Sep 17 00:00:00 2001 From: mjrode Date: Sun, 31 Mar 2019 18:55:38 -0500 Subject: [PATCH] Google oAuth --- config/local.js | 2 ++ server/controllers/auth.controller.js | 31 ++++++++++++------- .../migrations/20190224043920-create-user.js | 3 ++ server/db/models/user.js | 1 + server/index.js | 14 +++++++++ server/services/auth/passport.js | 23 +++++++++----- 6 files changed, 55 insertions(+), 19 deletions(-) diff --git a/config/local.js b/config/local.js index 7307b2d..8dfbdcb 100644 --- a/config/local.js +++ b/config/local.js @@ -1,6 +1,8 @@ const localConfig = { hostname: 'localhost', port: 8080, + googleClientID: process.env.GOOGLE_CLIENT_ID, + googleClientSecret: process.env.GOOGLE_CLIENT_SECRET, }; export default localConfig; diff --git a/server/controllers/auth.controller.js b/server/controllers/auth.controller.js index e7d07a1..c65e633 100644 --- a/server/controllers/auth.controller.js +++ b/server/controllers/auth.controller.js @@ -1,22 +1,29 @@ import {Router} from 'express'; import passport from 'passport'; -import authService from '../services/auth'; const router = Router(); -router.get('/google', authService.getAuthToken); +router.get( + '/google', + passport.authenticate('google', { + scope: ['profile', 'email'], + }), + (req, res) => { + res.redirect('/'); + }, +); -router.get('/users', plexService.getUsers); +router.get('/google/callback', passport.authenticate('google'), (req, res) => { + res.redirect('/'); +}); -router.get('/most-watched', plexService.getMostWatched); -router.get('/import/most-watched', plexService.importMostWatched); +router.get('/api/current_user', (req, res) => { + res.send(req.user); +}); -router.get('/sections', plexService.getSections); -router.get('/import/sections', plexService.importSections); - -router.get('/library/:id', plexService.getLibraryDataBySection); -router.get('/import/libraries', plexService.importLibraries); - -router.get('/import/all', plexService.importAll); +router.get('/api/logout', (req, res) => { + req.logout(); + res.redirect('/'); +}); export default router; diff --git a/server/db/migrations/20190224043920-create-user.js b/server/db/migrations/20190224043920-create-user.js index a8d2edd..ffdcf78 100644 --- a/server/db/migrations/20190224043920-create-user.js +++ b/server/db/migrations/20190224043920-create-user.js @@ -13,6 +13,9 @@ module.exports = { lastName: { type: Sequelize.STRING, }, + googleId: { + type: Sequelize.STRING, + }, email: { type: Sequelize.STRING, unique: true, diff --git a/server/db/models/user.js b/server/db/models/user.js index df16d3c..2e11c91 100644 --- a/server/db/models/user.js +++ b/server/db/models/user.js @@ -4,6 +4,7 @@ module.exports = (sequelize, DataTypes) => { { firstName: DataTypes.STRING, lastName: DataTypes.STRING, + googleId: DataTypes.STRING, email: {type: DataTypes.STRING, unique: true}, }, {}, diff --git a/server/index.js b/server/index.js index f948613..36c0bab 100644 --- a/server/index.js +++ b/server/index.js @@ -1,9 +1,12 @@ import express from 'express'; import {json, urlencoded} from 'body-parser'; // eslint-disable-next-line import/named +import passport from 'passport'; import {sequelize} from './db/models'; import plex from './routes/plex.route'; import tdaw from './routes/tdaw.route'; +import auth from './routes/auth.route'; +require('./services/auth/passport'); export default () => { const server = express(); @@ -18,9 +21,13 @@ export default () => { server.use(json()); server.use(urlencoded({extended: true})); + server.use(passport.initialize()); + server.use(passport.session()); + // Set up routes server.use('/plex', plex); server.use('/tdaw', tdaw); + server.use('/auth', auth); server.get('*', function(req, res, next) { const err = new Error('Page Not Found'); @@ -28,6 +35,13 @@ export default () => { next(err); }); + if (process.env.NODE_ENV === 'production') { + app.use(express.static('client/build')); + const path = require('path'); + app.get('*', (req, res) => { + res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html')); + }); + } // eslint-disable-next-line no-unused-vars server.use(function(err, req, res, next) { console.error(err.message); // Log error message in our server's console diff --git a/server/services/auth/passport.js b/server/services/auth/passport.js index d4708c8..84a95d9 100644 --- a/server/services/auth/passport.js +++ b/server/services/auth/passport.js @@ -1,15 +1,15 @@ const passport = require('passport'); const GoogleStrategy = require('passport-google-oauth20').Strategy; -const keys = require('../config/keys'); +const keys = require('../../../config'); -const User = mongoose.model('users'); +import models from '../../db/models'; passport.serializeUser((user, done) => { done(null, user.id); }); passport.deserializeUser((id, done) => { - User.findById(id).then(user => { + models.User.find(id).then(user => { done(null, user); }); }); @@ -17,19 +17,28 @@ passport.deserializeUser((id, done) => { passport.use( new GoogleStrategy( { - clientID: keys.googleClientID, - clientSecret: keys.googleClientSecret, + clientID: keys.default.server.googleClientID, + clientSecret: keys.default.server.googleClientSecret, callbackURL: '/auth/google/callback', proxy: true, }, async (accessToken, refreshToken, profile, done) => { - const existingUser = await User.findOne({googleId: profile.id}); + console.log(profile); + const existingUser = await models.User.findOne({ + where: {googleId: profile.id}, + }); if (existingUser) { return done(null, existingUser); } - const user = await new User({googleId: profile.id}).save(); + const user = await models.User.create({ + firstName: profile.name.givenName, + lastName: profile.name.familyName, + email: profile.emails[0].value, + googleId: profile.id, + }); + console.log('mikes user', user); done(null, user); }, ),