diego3g / rsxp-2023

Repositório contendo o código do app do RS/XP 2023
MIT License
443 stars 85 forks source link

feat: autenticação via Github #89

Closed vinifraga closed 1 year ago

vinifraga commented 1 year ago

📋 Descrição

Bom dia pessoal, trago uma proposta de autenticação com o Clerk principalmente para o mobile, mas também sugestões para o backend. Vou dividir essa issue em duas seções: mobile e back.

Mobile

Libs utilizadas:

Docs utilizadas:

Proposta

Utilizarmos o contexto AuthContext para gerenciar todo o fluxo que precisarmos de autenticação, deixando "transparente" para o restante dos devs as particularidades do Clerk. Esse contexto disponibiliza as seguintes funções e variáveis:

Para consumir os dados desse contexto, criei um hook chamado useAuth (temos que tomar cuidado na importação pois o @clerk/clerk-expo exporta um hook de mesmo nome)

Para centralizar os providers em um ambiente, sugiro a estrutura do AppProvider

Apesar do Clerk não disponibilizar componentes visuais no Expo, sugiro utilizarmos os helpers SignedIn e SignedOut para exibir condicionalmente componentes dependendo do status da autenticação do usuário.

Problemas

Apesar da documentação do Clerk acusar que a SDK deles não é compatível com a SDK 48 do Expo, não encontrei nenhum problema com a lib deles. Porém, definitivamente o maior empecilho dessa PR foi a incompatibilidade da SDK 48 do Expo e a lib expo-auth-session no Expo Go iOS. Tentei de várias formas resolver esse problema mas não consegui. Então quem for tentar autenticar no Expo Go via iOS não funciona por enquanto. Existe uma gambiara caso você realmente precise autenticar via iOS:

Backend

Libs utilizadas:

Docs utilizadas:

Proposta

Aqui não me aprofundei muito pessoal, basicamente importei os métodos sessions e users da SDK para validar a sessão e buscar os dados do usuário, respectivamente. Então basicamente editei a rota no AppController.tsx para receber os parâmetros sessionId e token que o mobile envia, validei a sessão, obtive o id do usuário e o utilizei para buscar o restante das informações.

Problemas

Como a SDK do Clerk já retorna uma instância inicializada e populada automaticamente com a variável ambiente CLERK_SECRET_KEY, eu tive que realizar o import 'dotenv/config'. Além disso, como não temos uma recipe do NestJS para o Clerk e como o Clerk retorna uma função em vez de uma classe, tive dificuldade em criar um provider como fizemos com o Prisma.

Fixes #61

🛠️ Tipo da mudança

Exclua as opções que não são relevantes.

🧪 Como isso foi testado?

Não adicionei testes para essa parte pois ainda precisamos definir o setup de testes no mobile.

✅ Checklist:

diego3g commented 1 year ago

@vinifraga brabo demais! resolve os conflitos pra nós?

vinifraga commented 1 year ago

@vinifraga brabo demais! resolve os conflitos pra nós?

Opa, por aqui na PR disse que não tenho acesso. Tem alguma sugestão?

image
diego3g commented 1 year ago

@vinifraga você precisa resolver os conflitos localmente, isto é, combinar o código mais atualizado do projeto com o código que você fez. Isso pode ser feito utilizando rebase ou dando um "git pull origin main" na sua branch e passando por cada conflito e resolvendo. Se quiser ajuda, me chama Discord.

vinifraga commented 1 year ago

Bom dia pessoal, encontrei esse artigo trazendo atualizações do Clerk para o Expo:

https://clerk.com/blog/changelog-2023-04-07?utm_source=changelog&utm_medium=email_campaign

Vou testar esse novo hook para ver se funciona bem e resolve o problema do Login social no iOS.

diego3g commented 1 year ago

@vinifraga Vou aguardar você testar isso antes de dar merge.

vinifraga commented 1 year ago

Essas últimas alterações foram implementar algumas mudanças pontuais: