From cb52c77c585fb87a7f0b64194acc43fe2b36d5aa Mon Sep 17 00:00:00 2001 From: Waseem Mansha Gondal Date: Mon, 27 Sep 2021 17:19:26 +0500 Subject: [PATCH] add passwport and stripe --- index.html | 0 index.js | 3 + package-lock.json | 89 ++++++++++++++++++++ package.json | 3 + src/middleware/passport.js | 86 +++++++++++++++++++ src/migrations/20210811073853-create-user.js | 6 ++ src/models/user.js | 6 ++ src/routes/index.js | 3 + src/routes/social.js | 40 +++++++++ src/routes/user.js | 8 ++ 10 files changed, 244 insertions(+) create mode 100644 index.html create mode 100644 src/middleware/passport.js create mode 100644 src/routes/social.js diff --git a/index.html b/index.html new file mode 100644 index 0000000..e69de29 diff --git a/index.js b/index.js index cae0cd1..c77096f 100644 --- a/index.js +++ b/index.js @@ -1,6 +1,8 @@ const express = require('express'); const { config } = require('./src/config'); var compression = require('compression'); +const passport = require('passport'); + const cors = require('cors'); const path = require('path'); const routes = require('./src/routes'); @@ -13,6 +15,7 @@ app.use( '/uploads/user/profileImages', express.static(path.join(__dirname, 'uploads/user/profileImages')) ); +app.use(passport.initialize()); app.use('/api/v1', routes); const port = config.port || 4000; const server = app.listen(port, () => { diff --git a/package-lock.json b/package-lock.json index 9d839c0..81863d5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -656,6 +656,11 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" + }, "bcrypt": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.0.1.tgz", @@ -3576,6 +3581,11 @@ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, + "oauth": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", + "integrity": "sha1-vR/vr2hslrdUda7VGWQS/2DPucE=" + }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -3704,6 +3714,75 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, + "passport": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz", + "integrity": "sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==", + "requires": { + "passport-strategy": "1.x.x", + "pause": "0.0.1" + } + }, + "passport-facebook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/passport-facebook/-/passport-facebook-3.0.0.tgz", + "integrity": "sha512-K/qNzuFsFISYAyC1Nma4qgY/12V3RSLFdFVsPKXiKZt434wOvthFW1p7zKa1iQihQMRhaWorVE1o3Vi1o+ZgeQ==", + "requires": { + "passport-oauth2": "1.x.x" + } + }, + "passport-google-oauth": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/passport-google-oauth/-/passport-google-oauth-2.0.0.tgz", + "integrity": "sha512-JKxZpBx6wBQXX1/a1s7VmdBgwOugohH+IxCy84aPTZNq/iIPX6u7Mqov1zY7MKRz3niFPol0KJz8zPLBoHKtYA==", + "requires": { + "passport-google-oauth1": "1.x.x", + "passport-google-oauth20": "2.x.x" + } + }, + "passport-google-oauth1": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-google-oauth1/-/passport-google-oauth1-1.0.0.tgz", + "integrity": "sha1-r3SoA99R7GRvZqRNgigr5vEI4Mw=", + "requires": { + "passport-oauth1": "1.x.x" + } + }, + "passport-google-oauth20": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/passport-google-oauth20/-/passport-google-oauth20-2.0.0.tgz", + "integrity": "sha512-KSk6IJ15RoxuGq7D1UKK/8qKhNfzbLeLrG3gkLZ7p4A6DBCcv7xpyQwuXtWdpyR0+E0mwkpjY1VfPOhxQrKzdQ==", + "requires": { + "passport-oauth2": "1.x.x" + } + }, + "passport-oauth1": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/passport-oauth1/-/passport-oauth1-1.2.0.tgz", + "integrity": "sha512-Sv2YWodC6jN12M/OXwmR4BIXeeIHjjbwYTQw4kS6tHK4zYzSEpxBgSJJnknBjICA5cj0ju3FSnG1XmHgIhYnLg==", + "requires": { + "oauth": "0.9.x", + "passport-strategy": "1.x.x", + "utils-merge": "1.x.x" + } + }, + "passport-oauth2": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.6.0.tgz", + "integrity": "sha512-emXPLqLcVEcLFR/QvQXZcwLmfK8e9CqvMgmOFJxcNT3okSFMtUbRRKpY20x5euD+01uHsjjCa07DYboEeLXYiw==", + "requires": { + "base64url": "3.x.x", + "oauth": "0.9.x", + "passport-strategy": "1.x.x", + "uid2": "0.0.x", + "utils-merge": "1.x.x" + } + }, + "passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" + }, "path": { "version": "0.12.7", "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", @@ -3745,6 +3824,11 @@ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==" }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -4704,6 +4788,11 @@ "is-typedarray": "^1.0.0" } }, + "uid2": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz", + "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==" + }, "umzug": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/umzug/-/umzug-2.3.0.tgz", diff --git a/package.json b/package.json index 78686a2..eedfe1d 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,9 @@ "multer": "^1.4.3", "mysql2": "^2.3.0", "nodemon": "^2.0.12", + "passport": "^0.4.1", + "passport-facebook": "^3.0.0", + "passport-google-oauth": "^2.0.0", "path": "^0.12.7", "pg": "^8.7.1", "sequelize": "^6.6.5", diff --git a/src/middleware/passport.js b/src/middleware/passport.js new file mode 100644 index 0000000..7af03f2 --- /dev/null +++ b/src/middleware/passport.js @@ -0,0 +1,86 @@ +/*eslint-disable*/ +const passport = require('passport'); +const FacebookStrategy = require('passport-facebook').Strategy; +var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy; +const { User } = require('../models'); +passport.use( + new FacebookStrategy( + { + clientID: process.env.FACEBOOK_CLIENT_ID, + clientSecret: process.env.FACEBOOK_CLIENT_SECRET, + callbackURL: 'http://localhost:8000/v1/social/facebook/callback', + profileFields: ['id', 'name', 'emails', 'picture.type(large)'], + }, + (accessToken, refreshToken, profile, done) => { + console.log({ profile }); + // return done(null); + User.findOne({ where: { facebookId: profile.id } }) + .then((user) => { + if (user) { + return done(null, user); + } + const name = `${profile.name.givenName} ${profile.name.familyName}`; + const newUser = new Users({ + facebookId: profile.id, + name: name, + provider: profile.provider, + email: profile.emails ? profile.emails[0].value : null, + firstName: profile.name.givenName, + lastName: profile.name.familyName, + profilePicture: profile.photos[0].value, + password: null, + }); + newUser.save((err, user) => { + if (err) { + return done(err, false); + } + + return done(null, user); + }); + }) + .catch((err) => { + return done(err, false); + }); + } + ) +); + +passport.use( + new GoogleStrategy( + { + clientID: process.env.GOOGLE_CLIENT_ID, + clientSecret: process.env.GOOGLE_CLIENT_SECRET, + callbackURL: 'http://localhost:8000/v1/google/callback', + }, + function (accessToken, refreshToken, profile, done) { + // return done(null); + Users.findOne({ where: { googleId: profile.id } }) + .then((user) => { + if (user) { + return done(null, user); + } else { + const name = `${profile.name.givenName} ${profile.name.familyName}`; + const newUser = new Users({ + name: name, + googleId: profile.id, + provider: profile.provider, + email: profile.emails ? profile.emails[0].value : null, + firstName: profile.name.givenName, + lastName: profile.name.familyName, + profilePicture: profile.photos[0].value, + password: null, + }); + newUser.save((err, user) => { + if (err) { + return done(err, false); + } + return done(null, user); + }); + } + }) + .catch((err) => { + return done(err, false); + }); + } + ) +); diff --git a/src/migrations/20210811073853-create-user.js b/src/migrations/20210811073853-create-user.js index cb3a159..f7d82b6 100644 --- a/src/migrations/20210811073853-create-user.js +++ b/src/migrations/20210811073853-create-user.js @@ -39,6 +39,12 @@ module.exports = { provider: { type: Sequelize.STRING, }, + facebookId: { + type: Sequelize.STRING, + }, + googleId: { + type: Sequelize.STRING, + }, createdAt: { allowNull: false, type: Sequelize.DATE, diff --git a/src/models/user.js b/src/models/user.js index 4c31599..ebf0401 100644 --- a/src/models/user.js +++ b/src/models/user.js @@ -44,6 +44,12 @@ module.exports = (sequelize, DataTypes) => { provider: { type: DataTypes.STRING, }, + facebookId: { + type: DataTypes.STRING, + }, + googleId: { + type: DataTypes.STRING, + }, }, { timestamps: true, diff --git a/src/routes/index.js b/src/routes/index.js index a3b1791..9a04f7d 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -4,16 +4,19 @@ const blogsRoutes = require('./blog'); const userRoutes = require('./user'); const subscriptionPlan = require('./subscriptionPlans'); const purchasedSubscription = require('./userSubscriptions'); +const socialRoutes = require('./social'); router.get('/', (req, res) => { res.status(200).json({ message: 'Apis running successfully', }); }); + router.use('/user', userRoutes); router.use('/blog', blogsRoutes); router.use('/plan', subscriptionPlan); router.use('/purchasedSubscription', purchasedSubscription); router.use('/blog', blogsRoutes); +router.use('/social', socialRoutes); module.exports = router; diff --git a/src/routes/social.js b/src/routes/social.js new file mode 100644 index 0000000..852c5e5 --- /dev/null +++ b/src/routes/social.js @@ -0,0 +1,40 @@ +const express = require('express'); +const router = express.Router(); +const passport = require('passport'); + +router.use(passport.initialize()); +router.get( + '/facebook', + passport.authenticate('facebook', { + session: false, + scope: ['public_profile', 'email'], + }) +); + +router.get( + '/facebook/callback', + passport.authenticate('facebook', { + successRedirect: '/', + failureRedirect: '/', + session: false, + }) +); + +router.get( + '/google', + passport.authenticate('google', { + session: false, + scope: ['profile', 'email'], + accessType: 'offline', + approvalPrompt: 'force', + }) +); +router.get( + '/google/callback', + passport.authenticate('google', { + failureRedirect: '/', + session: false, + }) +); + +module.exports = router; diff --git a/src/routes/user.js b/src/routes/user.js index a235b86..a1388d0 100644 --- a/src/routes/user.js +++ b/src/routes/user.js @@ -38,4 +38,12 @@ router.patch( userController.changeUserStatus ); +// router.get( +// '/facebook/callback', +// passport.authenticate('facebook', { +// successRedirect: '/', +// failureRedirect: '/', +// session: false, +// }) +// ); module.exports = router;