Skip to content

Commit 0cf42ef

Browse files
author
Siddaiah M
committed
Implemented facebook login auth feature
-user can login through facebook account
1 parent 13f1e93 commit 0cf42ef

File tree

7 files changed

+122
-4
lines changed

7 files changed

+122
-4
lines changed

.vscode/settings.json

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
{
2-
"window.zoomLevel": -1,
3-
"files.autoSave": "afterDelay",
2+
"window.zoomLevel": 1,
3+
"files.autoSave": "off",
44
"git.enableSmartCommit": true,
5-
"editor.formatOnSave": true,
65
"editor.codeActionsOnSave": {
76
"source.fixAll.eslint": true
87
}
9-
}
8+
}

README.md

+5
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ Check out projects built with the help of this open source app. Feel free to add
5151
- Get `Google_clientID` and `Google_clientSecret` by following [official OAuth tutorial](https://developers.google.com/identity/sign-in/web/sign-in#before_you_begin).
5252

5353
Important: For Google OAuth app, callback URL is: http://localhost:8000/oauth2callback <br/>
54+
Important: For Facebook OAuth app, callback URL is: http://localhost:8000/auth/facebook/callback <br/>
5455
Important: You have to enable Google+ API in your Google Cloud Platform account.
5556

5657
- Specify your own secret key for Express session `SESSION_SECRET`: https://github.com/expressjs/session#secret
@@ -69,6 +70,10 @@ To use all features and third-party integrations (such as Stripe, Google OAuth,
6970
Google_clientID="xxxxxx"
7071
Google_clientSecret="xxxxxx"
7172
73+
# Used in server/facebook.js
74+
FACEBOOK_CLIENT_ID="xxxxxxxxxx"
75+
FACEBOOK_CLIENT_SECRET="xxxxxxxx"
76+
7277
# Used in server/aws.js
7378
Amazon_accessKeyId="xxxxxx"
7479
Amazon_secretAccessKey="xxxxxx"

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
"next": "9.1.6",
4242
"nprogress": "0.2.0",
4343
"passport": "0.4.1",
44+
"passport-facebook": "^3.0.0",
4445
"passport-google-oauth": "2.0.0",
4546
"prop-types": "15.7.2",
4647
"qs": "6.9.1",

pages/public/login.js

+12
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,18 @@ function Login({ router }) {
1919
<p style={{ margin: '45px auto', fontSize: '44px', fontWeight: '400' }}>Log in</p>
2020
<p>You’ll be logged in for 14 days unless you log out manually.</p>
2121
<br />
22+
<Button
23+
variant="contained"
24+
style={{...styleLoginButton,backgroundColor:"darkblue",marginRight:"10px",color:"white"}}
25+
href={`/auth/facebook?redirectUrl=${redirectUrl}`}
26+
>
27+
<img
28+
src="/favicon-16x16.png"
29+
alt="Log in with Facebook"
30+
style={{ marginRight: '10px'}}
31+
/>
32+
Log in with Facebook
33+
</Button>
2234
<Button
2335
variant="contained"
2436
style={styleLoginButton}

public/favicon-16x16.png

561 Bytes
Loading

server/app.js

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const routesWithSlug = require('./routesWithSlug');
99
const routesWithCache = require('./routesWithCache');
1010
const sitemapAndRobots = require('./sitemapAndRobots');
1111

12+
const authFace = require('./facebook');
1213
const auth = require('./google');
1314
const { setupGithub } = require('./github');
1415
const api = require('./api');
@@ -92,6 +93,7 @@ app.prepare().then(async () => {
9293
await insertTemplates();
9394

9495
auth({ server, ROOT_URL });
96+
authFace({ server, ROOT_URL });
9597
setupGithub({ server });
9698
api(server);
9799

server/facebook.js

+99
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
const passport = require('passport');
2+
const strategy = require("passport-facebook");
3+
const User = require('./models/User');
4+
const FacebookStrategy = strategy.Strategy;
5+
6+
function authFace({ ROOT_URL, server }) {
7+
const verify = async (accessToken, refreshToken, profile, verified) => {
8+
const { first_name, last_name } = profile._json;
9+
let email;
10+
let avatarUrl;
11+
if (profile.emails) {
12+
email = profile.emails[0].value;
13+
}
14+
15+
if (profile.photos && profile.photos.length > 0) {
16+
avatarUrl = profile.photos[0].value;
17+
}
18+
19+
try {
20+
const user = await User.signInOrSignUp({
21+
email,
22+
firstName: first_name,
23+
lastName: last_name,
24+
googleId: profile.id,
25+
googleToken: { accessToken, refreshToken },
26+
displayName: profile.displayName,
27+
avatarUrl,
28+
});
29+
verified(null, user);
30+
} catch (err) {
31+
verified(err);
32+
console.log(err); // eslint-disable-line
33+
}
34+
};
35+
passport.use(
36+
new FacebookStrategy(
37+
{
38+
clientID: process.env.FACEBOOK_CLIENT_ID,
39+
clientSecret: process.env.FACEBOOK_CLIENT_SECRET,
40+
callbackURL: `${ROOT_URL}/auth/facebook/callback`,
41+
profileFields: ["id", "name","emails","displayName","profileUrl",'picture.type(large)']
42+
},
43+
verify,
44+
),
45+
);
46+
47+
passport.serializeUser((user, done) => {
48+
done(null, user.id);
49+
});
50+
51+
passport.deserializeUser((id, done) => {
52+
User.findById(id, User.publicFields(), (err, user) => {
53+
done(err, user);
54+
// eslint-disable-next-line no-console
55+
console.log('deserializeUser', id);
56+
});
57+
});
58+
59+
server.use(passport.initialize());
60+
server.use(passport.session());
61+
62+
server.get('/auth/facebook', (req, res, next) => {
63+
const options = {
64+
scope: ['email'],
65+
};
66+
67+
if (req.query && req.query.redirectUrl && req.query.redirectUrl.startsWith('/')) {
68+
req.session.finalUrl = req.query.redirectUrl;
69+
} else {
70+
req.session.finalUrl = null;
71+
}
72+
73+
passport.authenticate('facebook', options)(req, res, next)
74+
}
75+
);
76+
77+
server.get(
78+
'/auth/facebook/callback',
79+
passport.authenticate('facebook', {
80+
failureRedirect: '/login',
81+
}),
82+
(req, res) => {
83+
if (req.user && req.user.isAdmin) {
84+
res.redirect('/admin');
85+
} else if (req.session.finalUrl) {
86+
res.redirect(req.session.finalUrl);
87+
} else {
88+
res.redirect('/my-books');
89+
}
90+
},
91+
);
92+
93+
server.get('/logout', (req, res) => {
94+
req.logout();
95+
res.redirect('/login');
96+
});
97+
}
98+
99+
module.exports = authFace;

0 commit comments

Comments
 (0)