Esta API concentra os fluxos de autenticacao da plataforma Vyracare:
- registro de usuario;
- login;
- verificacao de primeiro acesso;
- definicao de senha no primeiro acesso;
- recuperacao de senha.
Ela foi organizada em um modelo de vertical slice, ou seja, cada caso de uso fica agrupado por feature, em vez de espalhado em pastas globais como Controllers, Services, Models e DTOs.
Se voce esta chegando agora, leia nesta ordem:
-
Program.cs
Aqui voce entende como a API sobe, registra dependencias, configura JWT, CORS, Swagger e o adaptador para AWS Lambda. -
Features/Auth/AuthController.cs
Aqui voce ve quais endpoints existem e para qual handler cada rota delega. -
Uma feature completa, por exemplo:
- RegisterRequest.cs
- RegisterHandler.cs
- RegisterResponse.cs
-
As portas do dominio:
- IUserRepository.cs
- IPasswordHasher.cs
- IJwtTokenGenerator.cs
-
Os adapters de infraestrutura:
- MongoUserRepository.cs
- Sha256PasswordHasher.cs
- JwtTokenGenerator.cs
- ParameterStoreBootstrapper.cs
-
Os testes:
- LoginHandlerTests.cs
- RegisterHandlerTests.cs
- Sha256PasswordHasherTests.cs
Aqui ficam componentes compartilhados por mais de uma feature:
Configuration
Classes tipadas que leem configuracoes doappsettings.jsone das variaveis de ambiente.Http
Extensoes para transformarUseCaseResultem resposta HTTP.Results
Contrato padrao de sucesso e erro usado pelos handlers.Time
Abstracao de tempo para facilitar testes e regras que dependem de data.
Aqui ficam os casos de uso do dominio de autenticacao.
Cada pasta representa um fluxo:
RegisterLoginFirstAccessCheckFirstAccessSetPasswordForgotPassword
Em cada fluxo, a ideia e sempre a mesma:
- um
Requestdefine a entrada; - um
Handlerimplementa a regra de negocio; - quando necessario, um
Responsedefine a saida.
Aqui ficam as pecas compartilhadas da feature:
- entidade de dominio
User; - interfaces que representam portas de saida da aplicacao;
- respostas simples como
MessageResponse.
Aqui ficam os detalhes tecnicos que a regra de negocio nao deve conhecer diretamente:
- acesso ao MongoDB;
- geracao de token JWT;
- hash de senha;
- leitura de parametros seguros da AWS;
- registro de dependencias no container.
Projeto de testes unitarios.
Ele valida handlers e componentes tecnicos isoladamente, sem depender de API Gateway, Lambda ou banco real.
Vamos usar o login como exemplo.
- O cliente faz
POST /api/auth/login. - O controller recebe o body e cria um
LoginRequest. - O controller resolve o
LoginHandlervia DI. - O handler consulta
IUserRepository. - O handler valida a senha usando
IPasswordHasher. - Se estiver tudo certo, usa
IJwtTokenGenerator. - O handler devolve um
UseCaseResult<LoginResponse>. - O controller transforma esse resultado em resposta HTTP.
Essa separacao existe para que:
- a regra de negocio possa ser testada sem banco e sem HTTP;
- a infraestrutura possa mudar sem quebrar os handlers;
- o codigo fique mais previsivel para evolucao.
Base path:
/api/auth
Rotas:
POST /api/auth/registerPOST /api/auth/loginPOST /api/auth/first-access/checkPOST /api/auth/first-access/set-passwordPOST /api/auth/forgot-password
Observacoes:
- essas rotas estao com
AllowAnonymous, porque sao a porta de entrada da autenticacao; - o restante da plataforma consome o token gerado aqui para acessar APIs protegidas.
O JWT e configurado no Program.cs usando as opcoes de:
Issuer;Audience;ExpiryMinutes;Keycarregada via Parameter Store ou fallback.
As configuracoes base versionadas hoje estao em appsettings.json.
Os valores sensiveis nao ficam versionados no repositorio.
Em runtime, a API usa nomes de parametro diferentes para cada ambiente:
prodvyracare/shared/mongo-prodvyracare/shared/jwt-signing-prod
hmlvyracare/shared/mongo-hmlvyracare/shared/jwt-signing-hml
devvyracare/shared/mongo-devvyracare/shared/jwt-signing-dev
Isso acontece em ParameterStoreBootstrapper.cs.
A autenticacao nao usa o mesmo nome de banco em dev e prod.
Regra atual:
mainpublica usandovyracare_dbdeveloppublica usandovyracare_db_dev
A connection string pode ser a mesma, mas o banco selecionado muda por variavel de ambiente da Lambda.
Se o parametro nao estiver disponivel, ainda existem fallbacks por variavel de ambiente:
MONGO_URIJWT_KEYJWT_ISSUERJWT_AUDIENCECORS_ALLOWED_ORIGINS
- login com usuario inexistente;
- login com credenciais validas;
- registro com conflito;
- registro com sucesso;
- hash e validacao de senha;
- partes de infraestrutura de seguranca que podem ser testadas isoladamente.
dotnet restore
dotnet build --no-restore
dotnet test Vyracare.Auth.Tests/Vyracare.Auth.Tests.csproj --no-restoreQuando voce criar um novo handler:
- crie um arquivo de teste espelhando a pasta da feature;
- use fakes ou mocks das portas do dominio;
- teste sucesso e falha;
- evite depender de MongoDB real.
Exemplo: ResetPassword.
Passo a passo:
- criar a pasta
Features/Auth/ResetPassword; - criar o
ResetPasswordRequest; - criar o
ResetPasswordHandler; - reutilizar as portas existentes ou criar uma nova se necessario;
- expor a rota no
AuthController; - registrar o handler em
ServiceCollectionExtensions; - criar os testes em
Vyracare.Auth.Tests.
dotnet restore
dotnet build
dotnet runSwagger:
/swagger/index.html
Para desenvolvimento local, o ideal e fornecer os valores sensiveis por:
dotnet user-secrets; ou- variaveis de ambiente.
O workflow de publicacao esta em .github/workflows/publish.yml.
Regra atual:
pushemdeveloppublica emdevpushemmainpublica emprod
A esteira reutilizavel da auth cria e atualiza recursos com nomes padronizados:
- Lambda
prodvyracare-api-authentication
- Lambda
devvyracare-api-authentication-dev
- API Gateway
prodvyracare-api-authentication
- API Gateway
devvyracare-api-authentication-dev
Em develop:
- Lambda com sufixo
-dev - API Gateway com sufixo
-dev - banco
vyracare_db_dev - secrets
*-dev
Em main:
- Lambda sem sufixo
- API Gateway sem sufixo
- banco
vyracare_db - secrets
*-prod
Esta API publica metadados em .vyracare/mfe-consumer.json.
Hoje o consumidor configurado e:
vyracare/vyracare-app-shell
Quando o deploy termina, a esteira atualiza automaticamente no shell:
apiUrl
nos arquivos:
src/environments/environments.dev.tssrc/environments/environments.hml.tssrc/environments/environments.prod.ts
O arquivo src/environments/environments.ts fica reservado para desenvolvimento local.
Isso evita ficar trocando manualmente a URL do API Gateway sempre que a autenticacao muda.
Se voce lembrar de uma regra, lembre desta:
- o controller recebe a request;
- o handler executa a regra;
- a porta define o contrato;
- a infraestrutura implementa o contrato;
- os testes validam o handler sem depender do mundo externo;
- a esteira separa
dev,hmleprodpor nome de recurso, parametro e banco.
Os commits deste repositorio devem ser escritos em portugues.
Padrao recomendado:
feat: adiciona validacao de primeiro acessofix: corrige leitura de parametro da autenticacaodocs: atualiza explicacao do fluxo de homologacao