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;