Skip to content

Commit 4996363

Browse files
committed
add google oauth
1 parent 1b21c76 commit 4996363

File tree

12 files changed

+114
-15
lines changed

12 files changed

+114
-15
lines changed

index.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,19 @@ const express = require("express");
55
const path = require("path");
66
const app = express();
77
const chalk = require("chalk");
8-
const passport = require("passport");
98
const session = require("express-session");
9+
const passport = require("passport");
10+
const mongoose = require("mongoose");
11+
const MongoStore = require("connect-mongo")(session);
1012
const PORT = process.env.PORT || 5000;
1113

14+
// Passport
15+
require("./src/utils/passport")(passport);
16+
17+
// Passport Middlewares
18+
app.use(passport.initialize());
19+
app.use(passport.session());
20+
1221
// Routes
1322
const apiRouter = require("./src/routes/api");
1423
const authRouter = require("./src/routes/auth");
@@ -22,9 +31,10 @@ app.use("/", indexRouter);
2231
// Sessions
2332
app.use(
2433
session({
25-
secret: process.env.SESSION_SECRET,
34+
secret: process.env.COOKIE_SESSION,
2635
resave: false,
2736
saveUninitialized: false,
37+
store: new MongoStore({ mongooseConnection: mongoose.connection }),
2838
})
2939
);
3040

public/style.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ nav {
6464
.main__whyComponent {
6565
width: 100%;
6666
margin-bottom: 2rem;
67+
font-weight: 500;
6768
font-size: larger;
6869
}
6970

165 KB
Loading
3.52 MB
Loading

src/auth.js

Whitespace-only changes.

src/database/models/user.js

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,29 +5,24 @@ const UserSchema = new mongoose.Schema({
55
type: String,
66
required: true,
77
},
8-
98
displayName: {
109
type: String,
1110
required: true,
1211
},
13-
1412
firstName: {
1513
type: String,
1614
required: true,
1715
},
18-
1916
lastName: {
2017
type: String,
2118
required: true,
2219
},
23-
2420
image: {
2521
type: String,
2622
},
27-
2823
createdAt: {
2924
type: Date,
30-
default: Date.now(),
25+
default: Date.now,
3126
},
3227
});
3328

src/middleware/requireAuth.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
const yourid = require("yourid");
2+
module.exports = {
3+
ensureAuth: function (req, res, next) {
4+
if (req.isAuthenticated()) {
5+
return next();
6+
} else {
7+
res.redirect(
8+
"/?redirect=" +
9+
req.originalUrl +
10+
"&error=You must be logged in to view this page." +
11+
`&error_id=${yourid.generate(15)}`
12+
);
13+
}
14+
},
15+
ensureGuest: function (req, res, next) {
16+
if (!req.isAuthenticated()) {
17+
return next();
18+
} else {
19+
res.redirect("/dashboard");
20+
}
21+
},
22+
};

src/routes/auth.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,19 @@ router.get("/", (req, res) => {
55
res.send(200);
66
});
77

8+
router.get("/google", passport.authenticate("google", { scope: ["profile"] }));
9+
10+
router.get(
11+
"/google/callback",
12+
passport.authenticate("google", {
13+
failureRedirect: "/",
14+
successRedirect: "/dashboard",
15+
})
16+
);
17+
18+
router.get("/logout", (req, res) => {
19+
req.logout();
20+
res.redirect("/");
21+
});
22+
823
module.exports = router;

src/routes/index.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
const router = require("express").Router();
22
const Image = require("../database/models/image");
3+
const { ensureAuth, ensureGuest } = require("../middleware/requireAuth");
34

4-
router.get("/", (req, res) => {
5+
router.get("/", ensureGuest, (req, res) => {
56
res.render("index");
67
});
78

89
router.get("/upload", (req, res) => {
910
res.render("upload");
1011
});
1112

12-
router.get("/dashboard", (req, res) => {
13-
// res.render("dashboard");
14-
res.send(200);
13+
router.get("/dashboard", ensureAuth, (req, res) => {
14+
res.render("dashboard");
1515
});
1616

17-
router.get("/view/:id", (req, res, next) => {
17+
router.get("/view/:id", ensureGuest, (req, res, next) => {
1818
Image.findOne({ imageId: req.params.id }, (err, image) => {
1919
if (err) {
2020
res.send(err);

src/utils/passport.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
const Google = require("passport-google-oauth20").Strategy;
2+
const mongoose = require("mongoose");
3+
const User = require("../database/models/User");
4+
5+
module.exports = function (passport) {
6+
passport.use(
7+
new Google(
8+
{
9+
clientID: process.env.GOOGLE_CLIENT_ID,
10+
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
11+
callbackURL: "/auth/google/callback",
12+
},
13+
14+
async (accessToken, refreshToken, profile, done) => {
15+
const newUser = {
16+
googleId: profile.id,
17+
displayName: profile.displayName,
18+
firstName: profile.name.givenName,
19+
lastName: profile.name.familyName,
20+
image: profile.photos[0].value,
21+
};
22+
23+
try {
24+
let user = await User.findOne({ googleId: profile.id });
25+
26+
if (user) {
27+
done(null, user);
28+
} else {
29+
user = await User.create(newUser);
30+
done(null, user);
31+
}
32+
} catch (err) {
33+
console.log(err);
34+
}
35+
}
36+
)
37+
);
38+
39+
passport.serializeUser((user, done) => {
40+
done(null, user.id);
41+
});
42+
43+
passport.deserializeUser((id, done) => {
44+
User.findById(id, (err, user) => done(err, user));
45+
});
46+
};

0 commit comments

Comments
 (0)