Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Customização dos campos de Auth, passando os campos e os respectivos tipos de dado + Documentação no README #22

Merged
merged 4 commits into from
Mar 1, 2024

Conversation

adilsonjuniordev
Copy link
Contributor

Olá @rodrigorahman e @brasizza, espero que vocês estejam bem!

Proposta

Conversei com o Rodrigo sobre a minha ideia, e ele aprovou a proposta, então decidi fazer este PR e venho solicitar que façam uma análise por favor, e qualquer dica que tiverem, ou ajuste necessário, estou disposto a complementar.

A ideia principal dessa implementação, é que o usuário do Json Rest Server tenha a possibilidade de personalizar o método de autenticação e os campos recebidos na request. Atualmente o padrão é "email" e "password", ambos como String.

Me surgiu uma necessidade de fazer um mock de uma API que utiliza CPF, telefone e data de nascimento para fazer a autenticação, com isso surgiu a ideia dessa implementação.


Implementação

No arquivo de configurações config.yaml, criei um novo parâmetro authFields, no qual devem ser passados os campos que serão validados na request de login. Esses campos devem ser passados juntamento com o seu nome + tipo de dado, que podem ser (string, int ou double)

Segue abaixo um exemplo:

auth:
  jwtSecret: cwsMXDtuP447WZQ63nM4dWZ3RppyMl
  jwtExpire: 604800

  authFields:
    - documento:
        type: string
    - celular:
        type: int

  urlSkip:
    - /users:
        method: post

Como o authFields é opcional, caso o parâmetro não seja definido no config.yaml, o JRS manterá a autenticação padrão, que utiliza "email" e "password", ambos como string.

Considerações Finais

Conforme falei com o Rodrigo, eu não tive possibilidade de implementar os testes, então isso está pendente. Percebi que não existe testes para quando o Auth está habilitado, então antes de fazer os testes para o authFields, eu teria que implementar os testes de Auth, e estou sem tempo para fazer isso no momento.

Caso consigam me ajudar com os testes, fico agradecido.

Obrigado pela atenção,
Abraço!

@brasizza
Copy link
Collaborator

@adilsonjuniordev , achei uns bugzinhos, estou corrigindo e mando pra vc em comentario

var user = {};

if (authConfig?.authFields.isEmpty ?? true) {
users.firstWhere(
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aqui faltou uma associação do user
user = users.firstWhere()
quando nao tem o auth config sempre retorna empty porque vc ta associando la em cima o user

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aqui realmente foi um erro, eu estava mexendo e acabei esquecendo de voltar a atribuição. Bem observado! Vou corrigir.

);
}

if (authConfig?.authFields.isNotEmpty ?? false) {
Copy link
Collaborator

@brasizza brasizza Feb 29, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

vc ta fazendo 2 verificações que nao precisa OU ele é vazio ou nao é vc pode alterar isso pra um if/else

exemplo

if (authConfig?.authFields.isEmpty ?? true) {
        user = users.firstWhere(
          (user) {
            return (user['email'] == bodyData['email'] && user['password'] == bodyData['password']);
          },
          orElse: () => {},
        );
      } else {
        int numberOfFields = authConfig!.authFields.length;
        
          //aqui continua seu codigo
        }

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, vou ajustar isso também

@adilsonjuniordev
Copy link
Contributor Author

@brasizza , subi as correções, verifica se está ok por favor

int validatedFields = 0;

for (var u in users) {
for (var field in authConfig.authFields) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Eu tava com o meu config autenticando por cnpj, ai eu tirei sem querer no json de auth e ele comecou a pipocar erro com exception nao tratada pois quando chegava no
bodyData[field.name]. esse fieldname nao existia na lista e estourava um monte de erro,

então fiz uma correção para quando ele estiver percorrendo os fields ele olha pra ver se esse field tem no bodyData, e se nao tiver já retorna um 500 informando que tem alguma coisa errada na autenticação com os campos

    for (var field in authConfig.authFields) {
              if (!(bodyData as Map).containsKey(field.name)) {
                return Response(
                  500,
                  body: jsonEncode({'error': 'field ${field.name} not found in validation. Please check if you put this validation in config.yaml  then remove it or send the correct fields to authenticate'}),
                  headers: jsonHelper.jsonReturn,
                );
              }
            }

Veja se isso faz sentido pra vc!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ótimo!!

@brasizza
Copy link
Collaborator

@rodrigorahman , com as alterações e correções propostas, o PR ta LEGIT.

  1. Os impactos são nulos quando não existe a configuração no yaml
  2. Quando existe, fizemos a verificação que se esse campo escolhido existe na requisição POST, retornando um 500 tratado caso não exista.
  3. Corretamente verificado e testado quando o campo existe, e o dado existe.

@rodrigorahman rodrigorahman merged commit 3ab5a8a into rodrigorahman:main Mar 1, 2024
2 checks passed
@adilsonjuniordev adilsonjuniordev restored the dev branch March 1, 2024 19:16
@adilsonjuniordev adilsonjuniordev restored the dev branch March 1, 2024 19:17
@adilsonjuniordev adilsonjuniordev restored the dev branch March 4, 2024 11:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants