Skip to content

Commit

Permalink
feautre(FacebookSocialLogin):
Browse files Browse the repository at this point in the history
Enable Social Login using facebook

[Delivers #167574878]
  • Loading branch information
Adekoreday committed Aug 1, 2019
1 parent 452b993 commit 24133b0
Show file tree
Hide file tree
Showing 16 changed files with 387 additions and 8 deletions.
142 changes: 139 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,10 @@
"debug": "^4.1.1",
"dotenv": "^8.0.0",
"express": "^4.17.1",
"express-session": "^1.16.2",
"morgan": "^1.9.1",
"passport": "^0.4.0",
"passport-facebook": "^3.0.0",
"pg": "^7.11.0",
"pg-hstore": "^2.3.3",
"sequelize": "^5.10.2",
Expand Down Expand Up @@ -61,6 +64,7 @@
"lint-staged": "^9.2.1",
"mocha": "^6.1.4",
"mocha-lcov-reporter": "^1.3.0",
"nock": "^10.0.6",
"nodemon": "^1.19.1",
"nyc": "^14.1.1",
"prettier-eslint-cli": "^5.0.0",
Expand Down
34 changes: 34 additions & 0 deletions server/controllers/Auth.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import models from '../database/models';

const { User } = models;

/**
* @export
* @class Users
*/
class Auth {
/**
* @name FacebookSocialLogin
* @async
* @static
* @memberof Auth
* @param {Object} request express request object
* @param {Object} response express response object
* @returns {JSON} JSON object with details of new user
*/
static async FacebookSocialLogin(request, response) {
const mail = request.user.emails[0].value;
const { givenName, familyName } = request.user.name;
const users = await User.findOrCreate({
where: { email: mail },
defaults: {
firstName: givenName,
lastName: familyName,
email: mail,
userName: givenName
}
});
response.status(200).json({ success: 'true', data: users[0].dataValues });
}
}
export default Auth;
17 changes: 17 additions & 0 deletions server/helpers/facebook.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import passport from 'passport';
import { Strategy as FacebookStrategy } from 'passport-facebook';
import callback from './passportCallback';

export default () => {
passport.use(
new FacebookStrategy(
{
clientID: process.env.FACEBOOK_APP_ID,
clientSecret: process.env.FACEBOOK_APP_SECRET,
callbackURL: process.env.REDIRECT_URL,
profileFields: ['id', 'first_name', 'last_name', 'photos', 'email']
},
callback
)
);
};
16 changes: 16 additions & 0 deletions server/helpers/passport.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import passport from 'passport';
import facebookPassport from './facebook';

export default (app) => {
app.use(passport.initialize());
app.use(passport.session());
passport.serializeUser((user, cb) => {
cb(null, user);
});

passport.deserializeUser((obj, cb) => {
cb(null, obj);
});

facebookPassport();
};
13 changes: 13 additions & 0 deletions server/helpers/passportCallback.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
/**
* @name passportError
* @static
* @memberof Users
* @param {string} accessToken express err object
* @param {string} refreshToken express request object
* @param {Object} profile express response object
* @param {function} done express next function
* @returns {JSON} JSON object with details of new user
*/
const callback = (accessToken, refreshToken, profile, done) => done(null, profile);

export default callback;
23 changes: 23 additions & 0 deletions server/helpers/passportError.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/**
* @export
* @class Users
*/
class ErrorCatcher {
/**
* @name passportError
* @static
* @memberof Users
* @param {Object} error express err object
* @param {Object} req express request object
* @param {Object} res express response object
* @param {function} next express next function
* @returns {JSON} JSON object with details of new user
*/
static passportErrors(error, req, res, next) {
if (!error) {
next();
}
res.status(400).json({ success: 'false', message: 'Auth failed' });
}
}
export default ErrorCatcher;
11 changes: 9 additions & 2 deletions server/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@ import swaggerUi from 'swagger-ui-express';
import YAML from 'yamljs';
import path from 'path';
import Debug from 'debug';
import session from 'express-session';
import routes from './routes';

const PORT = process.env.PORT || 9000;

config();

const PORT = process.env.PORT || 9000;
const debug = Debug('dev');

const app = express();
Expand All @@ -22,6 +22,13 @@ app.use(logger('dev'));
app.use(json());
app.use(urlencoded({ extended: false }));
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDoc));
app.use(
session({
secret: 'keyboard cat',
resave: true,
saveUninitialized: true
})
);

app.get('/', (request, response) => {
response.status(200).send('Welcome to Authors Haven ');
Expand Down
17 changes: 17 additions & 0 deletions server/routes/auth.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import express from 'express';
import passport from 'passport';
import Passport from '../helpers/passport';
import PassportError from '../helpers/passportError';
import Auth from '../controllers/Auth';

const auth = express.Router();

Passport(auth);
auth.get('/facebook', passport.authenticate('facebook', { scope: ['email'] }));
auth.get(
'/facebook/callback',
passport.authenticate('facebook', { failureRedirect: '/login' }),
PassportError.passportErrors,
Auth.FacebookSocialLogin
);
export default auth;
Loading

0 comments on commit 24133b0

Please sign in to comment.