Skip to content

Commit fd8f3c8

Browse files
committed
feat(auth): implementar autenticação OAuth com Google e GitHub
* Implementado fluxo completo de autenticação OAuth para Google e GitHub * Adicionado gerenciamento seguro de `state` utilizando `iron-session` * Implementada validação de `state` no callback OAuth para proteção contra CSRF * Corrigido fluxo do Google OAuth utilizando `openid-client` * Adicionado suporte ao `authorizationCodeGrant` com callback URL dinâmica * Implementado envio da URL completa de callback (`callbackUrl`) para providers OpenID * Refatorada arquitetura dos providers OAuth para padronização de interfaces * Criado tipo `ExchangeCodeParams` para desacoplamento entre controller/service/providers * Removido uso de `any` dos providers OAuth * Melhorada tipagem do fluxo de autenticação com Zod + TypeScript * Adicionados logs detalhados para debug do fluxo OAuth * Implementado suporte a múltiplos providers (`github`, `google`, `linkedin`) * Ajustado fluxo de criação/busca de usuário autenticado * Corrigidos problemas de incompatibilidade de tipos entre providers e AuthService * Estruturado fluxo para futura expansão de login social multi-provider
1 parent 026c6aa commit fd8f3c8

36 files changed

Lines changed: 488 additions & 1950 deletions

.cspell/custom-dictionary-workspace.txt

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ aceita
66
acentos
77
acesso
88
achar
9+
acontece
910
adicionais
1011
Adicionamos
1112
adzuna
@@ -40,7 +41,10 @@ atingido
4041
ativa
4142
ativas
4243
ativos
44+
atômica
45+
atômicas
4346
atuais
47+
atualização
4448
atualizadas
4549
aumentamos
4650
Aumentei
@@ -72,11 +76,13 @@ carregados
7276
carregamos
7377
cascadia
7478
casos
79+
Centraliza
7580
Certificados
7681
cespare
7782
chainalysis
7883
chainlink
7984
chamada
85+
Chamamos
8086
chave
8187
Chaves
8288
checamos
@@ -90,6 +96,7 @@ combinações
9096
commitar
9197
compartilhado
9298
completa
99+
complexa
93100
composta
94101
concluído
95102
concorrência
@@ -102,6 +109,7 @@ configurado
102109
configurados
103110
conflito
104111
conhecidas
112+
conjunto
105113
considere
106114
constrói
107115
contagem
@@ -145,6 +153,7 @@ devolvido
145153
diacríticos
146154
diferenciar
147155
diferentes
156+
dinamicamente
148157
direto
149158
disparado
150159
disponível
@@ -173,6 +182,7 @@ então
173182
envia
174183
enviado
175184
enviou
185+
envolver
176186
equivale
177187
equivalente
178188
ernstandyoung
@@ -189,6 +199,7 @@ esperada
189199
esperar
190200
estavam
191201
estilo
202+
estivesse
192203
Estranha
193204
estranho
194205
Estrutura
@@ -200,6 +211,7 @@ executar
200211
existem
201212
existente
202213
existirem
214+
expirado
203215
expirou
204216
explícito
205217
exporta
@@ -219,6 +231,7 @@ filtros
219231
Finaliza
220232
FINALIZADO
221233
fintech
234+
flexibilidade
222235
fluxo
223236
flyio
224237
fonte
@@ -228,6 +241,7 @@ formato
228241
fornecidas
229242
funciona
230243
funcionando
244+
futuro
231245
garantindo
232246
genérico
233247
goldmark
@@ -246,6 +260,7 @@ ignorado
246260
iguais
247261
implementa
248262
implementados
263+
Importando
249264
incompleto
250265
independente
251266
indisponivel
@@ -260,6 +275,7 @@ Inicializa
260275
inicializado
261276
Iniciando
262277
início
278+
injetar
263279
instacart
264280
Instancia
265281
inteligente
@@ -269,6 +285,7 @@ interrompe
269285
interrupção
270286
Intervalo
271287
Inválida
288+
invalidar
272289
isso
273290
jobsglobal
274291
jobsglobalscraper
@@ -295,10 +312,13 @@ Localização
295312
logar
296313
longo
297314
lote
315+
lugar
316+
mágica
298317
maior
299318
maioria
300319
maiúsculas
301320
mantém
321+
Mantemos
302322
manualmente
303323
Mapeando
304324
marca
@@ -311,6 +331,7 @@ mescladas
311331
mesma
312332
Mesmos
313333
metadados
334+
método
314335
MÉTRICA
315336
milissegundos
316337
mínimo
@@ -348,6 +369,7 @@ operações
348369
organização
349370
Origem
350371
origens
372+
orquestração
351373
otimizado
352374
outra
353375
pacote
@@ -361,15 +383,19 @@ paralelas
361383
paralelo
362384
parseia
363385
partir
386+
passos
364387
pegar
365388
pela
366389
pelos
367390
peloton
391+
pendentes
368392
permite
369393
permitida
394+
permitidos
370395
permitindo
371396
planetscale
372397
pôde
398+
poderia
373399
ponteiro
374400
populada
375401
populado
@@ -411,6 +437,7 @@ Quebrada
411437
quiser
412438
reais
413439
reaproveita
440+
recebe
414441
receber
415442
recente
416443
reconecta
@@ -453,6 +480,7 @@ sendo
453480
sensível
454481
separa
455482
separadas
483+
seria
456484
setar
457485
silencioso
458486
simplificado
@@ -482,6 +510,7 @@ tigra
482510
tipado
483511
titulo
484512
tiver
513+
transação
485514
trata
486515
tratamento
487516
travar
@@ -501,8 +530,12 @@ usam
501530
útil
502531
utilizando
503532
vaga
533+
validado
534+
Validamos
504535
validar
505536
validos
537+
valkey
538+
Valkey
506539
vamos
507540
várias
508541
variável
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
meta {
2+
name: GitHubAuthCallback
3+
type: http
4+
seq: 4
5+
}
6+
7+
get {
8+
url: {{base_url}}/auth/github/callback?code=4%2F0AeoWuM-9o1BomIsJXolunjZ34_ezLHxLEgIKhI1-Pvh11jD4YHFPBvspBBu6P1WhwuSczA&state=q5iv69L89IMH6cuWAvUjAb5nnfpqYzSwBc1tyo0lZbo
9+
body: none
10+
auth: inherit
11+
}
12+
13+
params:query {
14+
code: 4%2F0AeoWuM-9o1BomIsJXolunjZ34_ezLHxLEgIKhI1-Pvh11jD4YHFPBvspBBu6P1WhwuSczA
15+
state: q5iv69L89IMH6cuWAvUjAb5nnfpqYzSwBc1tyo0lZbo
16+
}
17+
18+
settings {
19+
encodeUrl: true
20+
timeout: 0
21+
}

backend/bruno/GitHubAuthUrl.bru

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
meta {
2+
name: GitHubAuthUrl
3+
type: http
4+
seq: 5
5+
}
6+
7+
get {
8+
url: {{base_url}}/auth/github/url
9+
body: none
10+
auth: inherit
11+
}
12+
13+
settings {
14+
encodeUrl: true
15+
timeout: 0
16+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
meta {
2+
name: GoogleAuthCallback
3+
type: http
4+
seq: 1
5+
}
6+
7+
get {
8+
url: {{base_url}}/auth/google/callback?code=4%2F0AeoWuM-9o1BomIsJXolunjZ34_ezLHxLEgIKhI1-Pvh11jD4YHFPBvspBBu6P1WhwuSczA&state=q5iv69L89IMH6cuWAvUjAb5nnfpqYzSwBc1tyo0lZbo
9+
body: none
10+
auth: inherit
11+
}
12+
13+
params:query {
14+
code: 4%2F0AeoWuM-9o1BomIsJXolunjZ34_ezLHxLEgIKhI1-Pvh11jD4YHFPBvspBBu6P1WhwuSczA
15+
state: q5iv69L89IMH6cuWAvUjAb5nnfpqYzSwBc1tyo0lZbo
16+
}
17+
18+
settings {
19+
encodeUrl: true
20+
timeout: 0
21+
}

backend/bruno/GoogleAuthUrl.bru

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
meta {
2+
name: GoogleAuthUrl
3+
type: http
4+
seq: 2
5+
}
6+
7+
get {
8+
url: {{base_url}}/auth/google/url
9+
body: none
10+
auth: inherit
11+
}
12+
13+
settings {
14+
encodeUrl: true
15+
timeout: 0
16+
}

backend/bruno/bruno.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"name": "Jobs_Scraper_Global",
3+
"version": "1",
4+
"type": "collection",
5+
"ignore": ["node_modules", ".git"]
6+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
vars {
2+
base_url: http://localhost:3001/api
3+
}

backend/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
"cors": "^2.8.6",
4141
"dotenv": "^17.3.1",
4242
"express": "^5.2.1",
43+
"iron-session": "^8.0.4",
4344
"pdfkit": "^0.18.0",
4445
"redis": "^4.7.1",
4546
"swagger-jsdoc": "^6.2.8",

backend/src/jobsApiApp.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
import { searchJobs, type ScrapeParams } from "./adapters/goScraper";
99
import { getConfig } from "./config";
1010
import { logWarn } from "./logger";
11+
import { authRoutes } from "./modules/auth/auth.routes";
1112

1213
interface JobsApiAppOptions {
1314
outputDir?: string;
@@ -60,6 +61,8 @@ export function createJobsApiApp(_options: JobsApiAppOptions = {}) {
6061
});
6162
app.use(cors(corsOptions));
6263

64+
app.use("/api/auth", authRoutes);
65+
6366
// ── health ────────────────────────────────────────────────────────────────
6467

6568
/**

0 commit comments

Comments
 (0)