diff --git a/src/api/auth/index.ts b/src/api/auth/index.ts new file mode 100644 index 0000000..613953a --- /dev/null +++ b/src/api/auth/index.ts @@ -0,0 +1,3 @@ +export { default as redirect } from "./redirect"; +export { default as refresh } from "./refresh"; +export { default as uri } from "./uri"; diff --git a/src/api/auth/redirect.ts b/src/api/auth/redirect.ts index 0dd539b..0906382 100644 --- a/src/api/auth/redirect.ts +++ b/src/api/auth/redirect.ts @@ -1,11 +1,11 @@ import { Hono } from "hono/tiny"; import { createRoute } from "../../modules/api-utils/createRoute"; import * as msal from "@azure/msal-node"; -import { msalClient } from "../../constants"; +import { io, msalClient } from "../../constants"; import { users } from "../../managers/users"; /* /v1/auth/redirect */ -export default createRoute("get", ["/"], async (c) => { +export default createRoute("get", ["/redirect"], async (c) => { c.status(200); const tokenRequest: msal.AuthorizationCodeRequest = { @@ -15,8 +15,22 @@ export default createRoute("get", ["/"], async (c) => { }; const authResult = await msalClient.acquireTokenByCode(tokenRequest); + const callbackKey = c.req.query().state as string; + const tokens = await users.authenticate(authResult); - await users.authenticate(authResult); + io.of(`/auth_callback`).emit(`auth:login:callback:${callbackKey}`, { + accessToken: tokens.accessToken, + refreshToken: tokens.refreshToken, + }); + + console.log("Emitted auth callback for key:", callbackKey); + + // Close the window because duh + return c.html( + ``, + ); return c.json({ status: 200, diff --git a/src/api/auth/refresh.ts b/src/api/auth/refresh.ts index 6a32f1a..b2a5fde 100644 --- a/src/api/auth/refresh.ts +++ b/src/api/auth/refresh.ts @@ -3,11 +3,13 @@ import { createRoute } from "../../modules/api-utils/createRoute"; import { sessions } from "../../managers/sessions"; /* /v1/auth/refresh */ -export default createRoute("post", ["/"], async (c) => { +export default createRoute("post", ["/refresh"], async (c) => { c.status(201); const refreshToken = c.req.header("x-refresh-token") || ""; + console.log("Received refresh token:", refreshToken); + const session = await sessions.fetch({ refreshToken: refreshToken, }); diff --git a/src/api/auth/uri.ts b/src/api/auth/uri.ts new file mode 100644 index 0000000..ea55cf8 --- /dev/null +++ b/src/api/auth/uri.ts @@ -0,0 +1,21 @@ +import { Hono } from "hono/tiny"; +import { createRoute } from "../../modules/api-utils/createRoute"; +import cuid from "cuid"; + +/* /v1/auth/uri */ +export default createRoute("get", ["/uri"], (c) => { + c.status(200); + + const callbackKey = cuid(); + const msUri = `https://login.microsoftonline.com/${process.env.MICROSOFT_TENANT_ID}/oauth2/v2.0/authorize?client_id=${process.env.MICROSOFT_CLIENT_ID}&response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fv1%2Fauth%2Fredirect&scope=openid+User.Read&state=${callbackKey}&prompt=login`; + + return c.json({ + status: 200, + message: "Successfully fetch Auth URI", + data: { + uri: msUri, + callbackKey: callbackKey, + }, + successful: true, + }); +}); diff --git a/src/api/routers/authRouter.ts b/src/api/routers/authRouter.ts new file mode 100644 index 0000000..735008e --- /dev/null +++ b/src/api/routers/authRouter.ts @@ -0,0 +1,7 @@ +import { Hono } from "hono"; +import * as authRoles from "../auth"; + +const authRouter = new Hono(); +Object.values(authRoles).map((r) => authRouter.route("/", r)); + +export default authRouter; diff --git a/src/api/server.ts b/src/api/server.ts index 48f69e8..95d6982 100644 --- a/src/api/server.ts +++ b/src/api/server.ts @@ -24,7 +24,7 @@ app.onError((err, ctx) => { return ctx.json( apiResponse.zodError(err), //@ts-ignore - apiResponse.zodError(err).status + apiResponse.zodError(err).status, ); } @@ -41,14 +41,13 @@ app.notFound((c) => { message: `Cannot ${c.req.method.toUpperCase()} ${c.req.path}`, status: 404, cause: "Unknown", - }) + }), ); return c.json(response, response.status); }); v1.route("/teapot", teapot); -v1.route("/auth/redirect", await import("./auth/redirect").then(m => m.default)); - +v1.route("/auth", require("./routers/authRouter").default); app.route("/v1", v1); -export default app; \ No newline at end of file +export default app; diff --git a/src/constants.ts b/src/constants.ts index cd8a3f0..0c7e775 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -50,6 +50,7 @@ export const msalClient = new msal.ConfidentialClientApplication(msalConfig); // Socket.io const io = new Server(); +const authIO = io.of("/auth_callback"); const engine = new Engine(); io.bind(engine); diff --git a/src/index.ts b/src/index.ts index e05c0f5..01d7f15 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,6 +3,7 @@ import { engine, PORT } from "./constants"; Bun.serve({ port: PORT, + websocket: engine.handler().websocket, fetch: (req, server) => { const url = new URL(req.url);