Entrar com Apple

Tentei atualizar nosso fork do plugin para usar a versão mais recente do omniauth-apple. (Note que há outras alterações necessárias, não apenas um aumento no número da versão).

tl;dr: ainda está quebrado

Consegui fazer funcionar com uma gambiarra no meu sandbox, mas ainda apresenta vários problemas:

  1. A Apple está usando uma requisição POST no callback. Isso não é comum em implementações OAuth, pois significa que cookies com samesite=Lax não serão enviados com a requisição. Isso impede que o Discourse leia os cookies de sessão durante o callback e, portanto, lança um erro CSRF.

    Uma solução INSEGURA é desabilitar essa segurança alterando os cookies do Discourse para samesite=None.

  2. Usar uma requisição POST sem um token CSRF também dispara outra medida de segurança no núcleo do sistema.

    Uma solução INSEGURA é remover esta linha.

  3. Estava recebendo um erro 403 da Apple quando o gem omniauth estava buscando os JWKs. Suspeito que o cabeçalho Accept: não esteja sendo definido corretamente, mas ainda não verifiquei isso.

    Uma solução INSEGURA foi codificar as chaves manualmente.

Após tudo isso, finalmente consegui fazer login com a Apple. Você pode testar em https://sandbox.dtaylor.uk (vou deixar funcionando por alguns dias, mas por favor, não insira nada sensível lá, pois é INSEGURO).

E então… e-mails e nomes ainda são incluídos apenas na primeira autenticação. Você pode testar isso: faça login com a Apple, cancele a criação da conta e tente novamente. Na segunda tentativa, seus dados estarão ausentes.

Então, supondo que a Apple não vá mudar nada em breve… como poderíamos fazer isso funcionar?

Para (1) e (2), acho que poderíamos converter o POST da Apple em um GET sem comprometer a segurança. Ao receber um POST no callback, renderizamos algum JavaScript que define window.location='/auth/apple/callback?code=...&state=...'. A partir daí, funcionaria como qualquer outro provedor. No entanto, acho que interceptar o POST exigiria algumas alterações na API central.

Para (3), acredito que isso poderia ser corrigido com um pouco de trabalho no gem omniauth.

Mas ainda estamos presos sem nome/e-mail, então não tenho certeza se vale a pena corrigir esses outros problemas :cry:

8 curtidas