diff --git a/src/handles.ts b/src/handles.ts index 990fa6d..d8880c2 100644 --- a/src/handles.ts +++ b/src/handles.ts @@ -1,10 +1,11 @@ import { HttpStatusCodes } from './constants.ts' +import { errors } from 'jose' import type { LoginDto, WebSocketData } from './types/types.ts' import { createAccessToken, verifyAccessToken } from './utils/jwt.ts' import { grpcClient } from './grpc/client.ts' import { config } from './config.ts' -export async function loginRequest(req: Request) { +export async function login(req: Request) { try { const body: LoginDto = await req.json() @@ -36,7 +37,10 @@ export async function loginRequest(req: Request) { tokenType: 'Bearer', expires: expires, }, - { status: HttpStatusCodes.CREATED, headers: { 'Set-Cookie': sessionCookie.toString() } }, + { + status: HttpStatusCodes.CREATED, + // headers: { 'Set-Cookie': sessionCookie.toString() } + }, ) } catch (error) { console.log({ error }) @@ -44,21 +48,35 @@ export async function loginRequest(req: Request) { } } -export async function wsRequest(req: Request, server: Bun.Server) { +export async function upgrade(req: Request, server: Bun.Server) { + const userId = await checkRequest(req) + if (!userId) return new Response('Invalid token', { status: HttpStatusCodes.NOT_FOUND }) + + const success = server.upgrade(req, { data: { userId: userId } }) + if (success) return undefined + return new Response('Upgrade failed', { status: HttpStatusCodes.BAD_REQUEST }) +} + +async function checkRequest(req: Request) { try { - const cookieHeader = req.headers.get('cookie') ?? '' - const cookies = new Bun.CookieMap(cookieHeader) - const token = cookies.get('token') - if (!token) return Response.json({ message: 'Invalid token' }, { status: HttpStatusCodes.NOT_FOUND }) + const url = new URL(req.url) + const token = url.searchParams.get('token') + if (!token) return null const payload = await verifyAccessToken(token) - const success = server.upgrade(req, { data: { userId: +payload.sub } }) - if (success) return undefined - - return new Response('Upgrade failed', { status: HttpStatusCodes.INTERNAL_SERVER_ERROR }) + console.log('token', token) + console.log(payload) + return +payload.sub } catch (error) { - console.log(error) - return new Response('Upgrade failed', { status: HttpStatusCodes.INTERNAL_SERVER_ERROR }) + if (error instanceof errors.JWTInvalid) { + console.log('invalid') + } + + if (error instanceof errors.JWTExpired) { + console.log('expired') + } + + return null } } diff --git a/src/index.ts b/src/index.ts index 6f53d0c..8fb833a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,7 @@ import { HttpStatusCodes } from './constants.ts' import type { WebSocketData, WsData } from './types/types.ts' -import { loginRequest, wsRequest } from './handles.ts' import { grpcClient as client } from './grpc/client.ts' +import { login, upgrade } from './handles.ts' const GROUP = 'group' const PORT = 3000 @@ -14,8 +14,8 @@ const server = Bun.serve({ const pathname = url.pathname const method = req.method - if (pathname === '/login' && method === 'POST') return loginRequest(req) - if (pathname === '/ws') return wsRequest(req, server) + if (pathname === '/login' && method === 'POST') return login(req) + if (pathname === '/ws') return upgrade(req, server) return new Response('Not found', { status: HttpStatusCodes.NOT_FOUND }) }, @@ -62,7 +62,7 @@ const server = Bun.serve({ const message = await client.createMessage({ chat_id: o.data.chat_id, user_id: ws.data.userId, - text: o.data.text + text: o.data.text, }) server.publish(o.data.chat_id, JSON.stringify({ type: 'CREATE_MESSAGE', ...message })) diff --git a/src/utils/jwt.ts b/src/utils/jwt.ts index ae1edc5..e8c86d6 100644 --- a/src/utils/jwt.ts +++ b/src/utils/jwt.ts @@ -31,6 +31,19 @@ export async function createAccessToken(userId: number, email: string) { return { tokenId, token } } +export async function verifyAccessToken(token: string) { + const { payload } = await jwtVerify(token, accessSecret, { + issuer: 'bun-auth-service', + audience: 'bun-api', + }) + + if (payload.type !== 'access') { + throw new Error('Invalid token type') + } + + return payload as TokenPayload +} + export async function createRefreshToken(userId: string, email: string): Promise<{ token: string; tokenId: string }> { const tokenId = generateUUID() @@ -50,19 +63,6 @@ export async function createRefreshToken(userId: string, email: string): Promise return { token, tokenId } } -export async function verifyAccessToken(token: string) { - const { payload } = await jwtVerify(token, accessSecret, { - issuer: 'bun-auth-service', - audience: 'bun-api', - }) - - if (payload.type !== 'access') { - throw new Error('Invalid token type') - } - - return payload as TokenPayload -} - export async function verifyRefreshToken(token: string) { const { payload } = await jwtVerify(token, refreshSecret, { issuer: 'bun-auth-service',