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