From 455f8f5c1f5155df0820fce5252abb5d169189cd Mon Sep 17 00:00:00 2001 From: kauacnok Date: Tue, 2 Jul 2024 10:05:48 -0300 Subject: [PATCH] feat: sharing login token between applications --- next.config.mjs | 10 ++++---- package.json | 4 +-- src/api/auth/RemoveUserCookies.ts | 33 ++++++++++++++++++++++++ src/api/auth/SetUserCookies.ts | 42 +++++++++++++++++++++++++++++++ src/app/api/auth/login/route.ts | 16 ++++++++++++ src/app/api/auth/logout/route.ts | 8 ++++++ src/middleware.ts | 6 +++-- 7 files changed, 110 insertions(+), 9 deletions(-) create mode 100644 src/app/api/auth/login/route.ts create mode 100644 src/app/api/auth/logout/route.ts diff --git a/next.config.mjs b/next.config.mjs index 24614b9..9fb3348 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -28,7 +28,7 @@ const nextConfig = { permanent: true }, { - source: '/user/:path', + source: '/user/:path*', destination: `${process.env.MANAGEMENT_DOMAIN}/user/:path*`, permanent: true }, @@ -38,17 +38,17 @@ const nextConfig = { permanent: true }, { - source: '/register/:path', - destination: `${process.env.MANAGEMENT_DOMAIN}/user/:path*`, + source: '/register/:path*', + destination: `${process.env.MANAGEMENT_DOMAIN}/register/:path*`, permanent: true }, { - source: '/monitoring/:path', + source: '/monitoring/:path*', destination: `${process.env.MONITORING_DOMAIN}/monitoring/:path*`, permanent: true }, { - source: '/workout/:path', + source: '/workout/:path*', destination: `${process.env.WORKOUT_DOMAIN}/workout/:path*`, permanent: true } diff --git a/package.json b/package.json index ff6bd19..530f043 100644 --- a/package.json +++ b/package.json @@ -3,9 +3,9 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev -p 3001", + "dev": "next dev -p 1213", "build": "next build", - "start": "next start -p 3001", + "start": "next start -p 1213", "lint": "next lint" }, "dependencies": { diff --git a/src/api/auth/RemoveUserCookies.ts b/src/api/auth/RemoveUserCookies.ts index 9958669..2d5b0ac 100644 --- a/src/api/auth/RemoveUserCookies.ts +++ b/src/api/auth/RemoveUserCookies.ts @@ -5,5 +5,38 @@ import { cookies } from "next/headers" export default async function RemoveUserCookies() { cookies().delete("user") + await fetch(`${process.env.MANAGEMENT_DOMAIN}/api/auth/logout`, { + method: "GET", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + } + }).catch((err) => { + console.log("Erro ao deslogar na aplicação de coaching") + return + }) + + await fetch(`${process.env.MONITORING_DOMAIN}/api/auth/logout`, { + method: "GET", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + } + }).catch((err) => { + console.log("Erro ao deslogar na aplicação de monitoria") + return + }) + + await fetch(`${process.env.WORKOUT_DOMAIN}/api/auth/logout`, { + method: "GET", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + } + }).catch((err) => { + console.log("Erro ao deslogar na aplicação de workout") + return + }) + return } \ No newline at end of file diff --git a/src/api/auth/SetUserCookies.ts b/src/api/auth/SetUserCookies.ts index cb8ccd7..726531a 100644 --- a/src/api/auth/SetUserCookies.ts +++ b/src/api/auth/SetUserCookies.ts @@ -11,6 +11,48 @@ export default async function SetUserCookies(response: IResult, status: boolean) maxAge: 60 * 60 * 24 * 7, // one week }) + const object = { + idUser: response.idUser, + accessToken: response.accessToken, + refreshToken: response.refreshToken + } + + await fetch(`${process.env.MANAGEMENT_DOMAIN}/api/auth/login`, { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + }, + body: JSON.stringify(object) + }).catch((err) => { + console.log("Erro ao logar na aplicação de coaching") + return + }) + + await fetch(`${process.env.MONITORING_DOMAIN}/api/auth/login`, { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + }, + body: JSON.stringify(object) + }).catch((err) => { + console.log("Erro ao logar na aplicação de monitoria") + return + }) + + await fetch(`${process.env.WORKOUT_DOMAIN}/api/auth/login`, { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + }, + body: JSON.stringify(object) + }).catch((err) => { + console.log("Erro ao logar na aplicação de workout") + return + }) + } } diff --git a/src/app/api/auth/login/route.ts b/src/app/api/auth/login/route.ts new file mode 100644 index 0000000..83836b7 --- /dev/null +++ b/src/app/api/auth/login/route.ts @@ -0,0 +1,16 @@ +import { cookies } from "next/headers"; +import { NextRequest, NextResponse } from "next/server"; + +export async function POST(request: NextRequest) { + + const data = await request.json() + + cookies().set("user", JSON.stringify(data), { + httpOnly: true, + sameSite: "strict", + secure: false, + maxAge: 60 * 60 * 24 * 7, // one week + }) + + return NextResponse.json({ message: "Set Cookies" }, { status: 200 }); +} diff --git a/src/app/api/auth/logout/route.ts b/src/app/api/auth/logout/route.ts new file mode 100644 index 0000000..10d7f68 --- /dev/null +++ b/src/app/api/auth/logout/route.ts @@ -0,0 +1,8 @@ +import { cookies } from "next/headers"; +import { NextResponse } from "next/server"; + +export async function GET() { + cookies().delete("user") + + return NextResponse.json({ message: "Removed Cookies" }, { status: 200 }); +} \ No newline at end of file diff --git a/src/middleware.ts b/src/middleware.ts index 77d71de..c17affd 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -33,6 +33,8 @@ export function middleware(request: NextRequest) { }) if (!validRoute) { + const pathNameWithRegex = pathname.match(/\/[\w-]+\/[\w-]+/g) + const pathNameWithRegex2 = pathNameWithRegex != null ? pathNameWithRegex.join('') : "" const validActionRoutes: Array = actionRoutes.filter((e) => { return e.permissions.some((e: number) => { return e == Number(tokenUserValues.permission) @@ -40,7 +42,7 @@ export function middleware(request: NextRequest) { }) validActionRoutes.map((item: ActionRoutes) => { - if (item.route == pathname) { + if (item.route == pathNameWithRegex2) { validRoute = true } }) @@ -54,5 +56,5 @@ export function middleware(request: NextRequest) { } export const config = { - matcher: ['/', '/user', '/user/:path*'] + matcher: ['/', '/coaching', '/coaching/:path*'] } \ No newline at end of file