From 973fbea98029e01134393e66eaec1c4367d71a0b Mon Sep 17 00:00:00 2001 From: alex Date: Sat, 13 Jan 2024 22:29:59 +0100 Subject: [PATCH] passport --- package-lock.json | 121 ++++++++++++++++++++++++++ package.json | 3 + server.ts | 23 ++++- src/controllers/calendarController.ts | 1 + src/controllers/storeController.ts | 1 - src/routes/calendarRoutes.ts | 27 ++++++ 6 files changed, 174 insertions(+), 2 deletions(-) create mode 100644 src/controllers/calendarController.ts create mode 100644 src/routes/calendarRoutes.ts diff --git a/package-lock.json b/package-lock.json index 5ed0926..8b860df 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,8 @@ "dotenv": "^16.3.1", "express": "^4.18.2", "mariadb": "^3.2.3", + "passport": "^0.7.0", + "passport-google-oauth20": "^2.0.0", "pino": "^8.17.2", "pino-pretty": "^10.3.1", "sequelize": "^6.35.2", @@ -27,6 +29,7 @@ "@types/bcrypt": "^5.0.2", "@types/cors": "^2.8.17", "@types/express": "^4.17.21", + "@types/passport-google-oauth20": "^2.0.14", "@types/swagger-jsdoc": "^6.0.4", "@types/swagger-ui-express": "^4.1.6", "@types/uuid": "^9.0.7", @@ -212,6 +215,46 @@ "undici-types": "~5.26.4" } }, + "node_modules/@types/oauth": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@types/oauth/-/oauth-0.9.4.tgz", + "integrity": "sha512-qk9orhti499fq5XxKCCEbd0OzdPZuancneyse3KtR+vgMiHRbh+mn8M4G6t64ob/Fg+GZGpa565MF/2dKWY32A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/passport": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.16.tgz", + "integrity": "sha512-FD0qD5hbPWQzaM0wHUnJ/T0BBCJBxCeemtnCwc/ThhTg3x9jfrAcRUmj5Dopza+MfFS9acTe3wk7rcVnRIp/0A==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/passport-google-oauth20": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@types/passport-google-oauth20/-/passport-google-oauth20-2.0.14.tgz", + "integrity": "sha512-ZaZpRUAeMl3vy298ulKO1wGLn9SQtj/CyIfZL/Px5xU9pybMiQU3mhXDCBiWSbg0EK9uXT4ZoWC3ktuWY+5fwQ==", + "dev": true, + "dependencies": { + "@types/express": "*", + "@types/passport": "*", + "@types/passport-oauth2": "*" + } + }, + "node_modules/@types/passport-oauth2": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@types/passport-oauth2/-/passport-oauth2-1.4.15.tgz", + "integrity": "sha512-9cUTP/HStNSZmhxXGuRrBJfEWzIEJRub2eyJu3CvkA+8HAMc9W3aKdFhVq+Qz1hi42qn+GvSAnz3zwacDSYWpw==", + "dev": true, + "dependencies": { + "@types/express": "*", + "@types/oauth": "*", + "@types/passport": "*" + } + }, "node_modules/@types/qs": { "version": "6.9.11", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", @@ -413,6 +456,14 @@ } ] }, + "node_modules/base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/bcrypt": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", @@ -1568,6 +1619,11 @@ "set-blocking": "^2.0.0" } }, + "node_modules/oauth": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", + "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==" + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -1625,6 +1681,61 @@ "node": ">= 0.8" } }, + "node_modules/passport": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz", + "integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==", + "dependencies": { + "passport-strategy": "1.x.x", + "pause": "0.0.1", + "utils-merge": "^1.0.1" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, + "node_modules/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==", + "dependencies": { + "passport-oauth2": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/passport-oauth2": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.7.0.tgz", + "integrity": "sha512-j2gf34szdTF2Onw3+76alNnaAExlUmHvkc7cL+cmaS5NzHzDP/BvFHJruueQ9XAeNOdpI+CH+PWid8RA7KCwAQ==", + "dependencies": { + "base64url": "3.x.x", + "oauth": "0.9.x", + "passport-strategy": "1.x.x", + "uid2": "0.0.x", + "utils-merge": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, + "node_modules/passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -1638,6 +1749,11 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, + "node_modules/pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" + }, "node_modules/pg-connection-string": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", @@ -2324,6 +2440,11 @@ "node": ">=14.17" } }, + "node_modules/uid2": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz", + "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==" + }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", diff --git a/package.json b/package.json index 3d5106c..a8d1905 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,8 @@ "dotenv": "^16.3.1", "express": "^4.18.2", "mariadb": "^3.2.3", + "passport": "^0.7.0", + "passport-google-oauth20": "^2.0.0", "pino": "^8.17.2", "pino-pretty": "^10.3.1", "sequelize": "^6.35.2", @@ -29,6 +31,7 @@ "@types/bcrypt": "^5.0.2", "@types/cors": "^2.8.17", "@types/express": "^4.17.21", + "@types/passport-google-oauth20": "^2.0.14", "@types/swagger-jsdoc": "^6.0.4", "@types/swagger-ui-express": "^4.1.6", "@types/uuid": "^9.0.7", diff --git a/server.ts b/server.ts index 182e29b..001f800 100644 --- a/server.ts +++ b/server.ts @@ -3,7 +3,9 @@ import dotenv from "dotenv"; import bodyParser from "body-parser"; import swaggerUI from "swagger-ui-express"; import cors from "cors"; +import GoogleStrategy from "passport-google-oauth20"; +import calendarRoutes from "./src/routes/calendarRoutes"; import storeRoutes from "./src/routes/storeRoutes"; import storeServicesRoutes from "./src/routes/storeServicesRoutes"; import userRoutes from "./src/routes/userRoutes"; @@ -14,6 +16,7 @@ dotenv.config(); import swaggerJsDoc from "swagger-jsdoc"; import syncModels from "./src/models/index"; import logger from "./src/logger/logger"; +import passport from "passport"; const app: Express = express(); const host = process.env.HOST || "localhost"; const port = Number(process.env.PORT) || 3000; @@ -43,9 +46,27 @@ const options = { apis: ["./src/routes/*.ts"], }; -// TODO: add cors +passport.use( + new GoogleStrategy.Strategy( + { + clientID: process.env.GOOGLE_CLIENT_ID as string, + clientSecret: process.env.GOOGLE_CLIENT_SECRET as string, + callbackURL: process.env.GOOGLE_CALLBACK_URL as string, + }, + (accessToken, refreshToken, profile, cb) => { + console.log("accessToken", accessToken); + console.log("refreshToken", refreshToken); + console.log("profile", profile); + return cb(null, profile); + } + ) +); + +// TODO: setup cors app.use(cors()); + app.use(bodyParser.json()); +app.use("/api/v1/calendar", calendarRoutes); app.use("/api/v1/store", storeRoutes); app.use("/api/v1/store/services", storeServicesRoutes); app.use("/api/v1/user", userRoutes); diff --git a/src/controllers/calendarController.ts b/src/controllers/calendarController.ts new file mode 100644 index 0000000..464dfcc --- /dev/null +++ b/src/controllers/calendarController.ts @@ -0,0 +1 @@ +import { Request, Response } from "express"; diff --git a/src/controllers/storeController.ts b/src/controllers/storeController.ts index 3684f83..2306846 100644 --- a/src/controllers/storeController.ts +++ b/src/controllers/storeController.ts @@ -1,7 +1,6 @@ import { Request, Response } from "express"; import Store from "../models/store"; import { getUserSession } from "../utils/utils"; -import logger from "../logger/logger"; export async function GetStore(req: Request, res: Response) { try { diff --git a/src/routes/calendarRoutes.ts b/src/routes/calendarRoutes.ts new file mode 100644 index 0000000..0817610 --- /dev/null +++ b/src/routes/calendarRoutes.ts @@ -0,0 +1,27 @@ +import express from "express"; +const router = express.Router(); + +import * as calendarController from "../controllers/calendarController"; +import passport from "passport"; + +router.get( + "/auth/google", + passport.authenticate("google", { + scope: [ + "https://www.googleapis.com/auth/calendar.app.created", + "https://www.googleapis.com/auth/calendar.events.freebusy", + ], + }) +); + +router.get( + "/auth/google/callback", + passport.authenticate("google", { failureRedirect: "/login" }), + function (req, res) { + // Successful authentication, redirect home. + console.log("req.user", req.user); + res.redirect("https://localhost:50127/s"); + } +); + +export default router;