feat: add telegram authorization

This commit is contained in:
Sergey Krylov 2026-02-20 06:41:01 +03:00
parent 13e4937925
commit 98643fee39
5 changed files with 47 additions and 4 deletions

View File

@ -6,7 +6,8 @@ import {
HttpStatus, HttpStatus,
Post, Post,
Req, Req,
Res, UnauthorizedException Res,
UnauthorizedException
} from '@nestjs/common' } from '@nestjs/common'
import { ConfigService } from '@nestjs/config' import { ConfigService } from '@nestjs/config'
import { ApiOperation } from '@nestjs/swagger' import { ApiOperation } from '@nestjs/swagger'
@ -16,6 +17,7 @@ import { lastValueFrom } from 'rxjs'
import { AuthClientGrpc } from './auth.grpc' import { AuthClientGrpc } from './auth.grpc'
import { import {
SendOtpRequestDto, SendOtpRequestDto,
TelegramFinalyzeRequestDto,
TelegramVerifyDto, TelegramVerifyDto,
VerifyOtpRequestDto VerifyOtpRequestDto
} from './dto' } from './dto'
@ -137,4 +139,27 @@ export class AuthController {
throw new UnauthorizedException('Invalid telegram login response') throw new UnauthorizedException('Invalid telegram login response')
} }
@Post('telegram/finalize')
@HttpCode(HttpStatus.OK)
public async finalyzeTelegramLogin(
@Body() dto: TelegramFinalyzeRequestDto,
@Res({ passthrough: true }) res: Response
) {
const { sessionId } = dto
const { accessToken, refreshToken } = await lastValueFrom(
this.client.telegramConsume({ sessionId })
)
res.cookie('refreshToken', refreshToken, {
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
domain: this.config.getOrThrow('COOKIES_DOMAIN'),
sameSite: 'lax',
maxAge: 30 * 24 * 60 * 60 * 1000
})
return { accessToken }
}
} }

View File

@ -4,6 +4,7 @@ import {
AuthServiceClient, AuthServiceClient,
RefreshRequest, RefreshRequest,
SendOtpRequest, SendOtpRequest,
TelegramConsumeRequest,
TelegramVerifyRequest, TelegramVerifyRequest,
VerifyOtpRequest VerifyOtpRequest
} from '@teacinema/contracts/gen/auth' } from '@teacinema/contracts/gen/auth'
@ -37,4 +38,8 @@ export class AuthClientGrpc implements OnModuleInit {
public telegramVerify(request: TelegramVerifyRequest) { public telegramVerify(request: TelegramVerifyRequest) {
return this.authService.telegramVerify(request) return this.authService.telegramVerify(request)
} }
public telegramConsume(request: TelegramConsumeRequest) {
return this.authService.telegramConsume(request)
}
} }

View File

@ -1,3 +1,4 @@
export * from './send-otp.request.dto' export * from './send-otp.request.dto'
export * from './verify-otp.request.dto' export * from './verify-otp.request.dto'
export * from './telegram-verify.dto' export * from './telegram-verify.dto'
export * from './telegram-finalyze.request.dto'

View File

@ -0,0 +1,12 @@
import { ApiProperty } from '@nestjs/swagger'
import { IsNotEmpty, IsString } from 'class-validator'
export class TelegramFinalyzeRequestDto {
@ApiProperty({
description: 'Telegram session id',
example: '4399b5e099fb40a8e6e8a4ca5120e43c'
})
@IsString()
@IsNotEmpty()
sessionId: string
}

View File

@ -1221,9 +1221,9 @@
integrity sha512-q3DURJbSk3k8MNWFIYaSM4LEcBgPbWa+HJmBz/nzYT4kuYitJVSXxpZ97kr0Ea+81AZwAU3JhQKlkK0SBWUi0A== integrity sha512-q3DURJbSk3k8MNWFIYaSM4LEcBgPbWa+HJmBz/nzYT4kuYitJVSXxpZ97kr0Ea+81AZwAU3JhQKlkK0SBWUi0A==
"@teacinema/contracts@^1.0.0": "@teacinema/contracts@^1.0.0":
version "1.0.8" version "1.0.9"
resolved "https://git.ksv741.keenetic.pro/api/packages/teacinema/npm/%40teacinema%2Fcontracts/-/1.0.8/contracts-1.0.8.tgz#4e31c3a370b0808629d9c93900c5f27958ef82e6" resolved "https://git.ksv741.keenetic.pro/api/packages/teacinema/npm/%40teacinema%2Fcontracts/-/1.0.9/contracts-1.0.9.tgz#14b136d0c08552147b0de637a7af6d340d538527"
integrity sha512-xyPyifbVwWelgo4MsvhhRl//To+b0Tnp8DtANCzwLBUhwPj3ZG19QgfPB7Ih7PsBU5TD6F80aNlITDxJbFgkFQ== integrity sha512-9BwWvXaDKgRcef6+1ep9vUDWBdOndqheeTX5mXK5OOvLXbLOlzYoqAUoT0ZwaRwOCD+Je/LDrqcdti6eoss71Q==
dependencies: dependencies:
"@nestjs/microservices" "^11.1.12" "@nestjs/microservices" "^11.1.12"
protoc "33.4.0" protoc "33.4.0"