Cadastrar e autenticar usuário através de um mesmo fluxo.
-
Estamos trabalhando em um fluxo para fazer a autenticação do usuário. A lógica do fluxo segue a orientação que nos foi sugerida pelo pessoal da softwell.
Passo 1 - Realiza a requisição POST para o webservice de login
Passo 2 - Verifica se o retorno da chave "LoggedIn" é true.
Passo 3 - Caso o retorno da chave LoggedIn seja false, monte a mensagem de erro, caso seja true prossiga com o o login
Passo 4 - Verifica se o usuário já existe no banco de dados DO MAKER. (É importante ter o usuário cadastrado no Maker para que seja possível usar a função Autenticar Usuário).
Passo 4a (Usuário já existe) - Veja Passo 5
Passo 4b (Usuário não existe) - Nesse caso nós pegamos as informações do usuário (Login, nome...) e registramos o usuário na tabela fr_usuario do maker.
Passo 5 - Concatenar o código do usuário (usr_codigo na fr_usuario) com a senha fornecida em tela, e gerar um hash MD5 para comparar com o que está salvo no maker. A função autenticar Usuário sempre vai fazer essa concatenação e hash da senha, por isso precisamos ter esse hash para verificar.
Passo 6 - Verifica se o Hash gerado é o mesmo salvo no banco de dados para o usuário. Caso não seja (ou, no caso do usuário novo, caso o campo senha esteja nulo), Insere a nova senha na fr_usuário.
Passo 7 - Autentica o usuário através da função nativa do maker, Autenticar Usuário. Isso é feito para que o usuário tenha acesso de forma segura as telas internas do aplicativo.Problemas encontrados: O principal problema encontrado até o momento, é que quando nós tentamos realizar a operação de cadastro de usuário (inserindo as informações na fr_usuario) no mesmo fluxo que realiza a autenticação, a autenticação falha, retorna mensagem de usuário/senha inválidos, e dá rollback nas atualizações do banco de dados, fazendo com que o usuário não seja salvo. É interessante apontar que, o EXATO mesmo fluxo, apenas retirando a função "Auntenticar Usuário" do final, consegue cadastrar o usuário no banco de dados. Da mesma forma, caso o usuário já esteja cadastrado previamente, a função "Autenticar Usuário" funciona perfeitamente. Já tentamos dividir em subfluxos, tanto isolando somente a parte da autenticação, e chamando ao final do fluxo que consome o webservice e faz o cadastro, e também isolar todo o resto do fluxo e chamar como um subfluxo antes da função de autenticação, e ambas as formas apresentam o mesmo problema. Parece que o banco de dados só é atualizado com o cadastro novo no momento em que o fluxo que faz a transação acaba (com sucesso, já que se o fluxo retorna uma mensagem de erro em qualquer momento ele aparenta dar rollback em qualquer mudança). Por conta disso, a função "Autenticar Usuário" não encontra o registro recém criado, resultando na falha de autenticação. Precisamos saber por quê isso acontece, e como resolvemos, para que o usuário, independente de ser o primeiro acesso ou não, consiga ser autenticado com apenas um click.
-
Controle a transação de inserção na fr_usurio com as funções "transação - abrir" e "transação - commit". Entre elas vai estar o seu processmento de inserção do usuário. Dessa forma vc irá garantir que a transação de inserção terá sido concluída, mesmo antes do fluxo terminar (Que é o padrão do maker e é o motivo pelo qual vc ainda não consegue autenticar quando está no mesmo fluxo).