Accedi con Apple

Ho provato a aggiornare la nostra fork del plugin per utilizzare l’ultima versione di omniauth-apple. (Nota che sono necessari alcuni altri cambiamenti, non solo un aggiornamento del numero di versione).

tl;dr: è ancora rotto

Sono riuscito a farlo funzionare con delle modifiche sul mio sandbox, ma presenta ancora diversi problemi:

  1. Apple utilizza una richiesta POST sul callback. Questo non è comune nelle implementazioni OAuth perché significa che i cookie con samesite=Lax non verranno inviati con la richiesta. Ciò significa che Discourse non riesce a leggere i cookie di sessione durante il callback e quindi restituisce un errore CSRF.

    Un workaround INSECURO consiste nel disabilitare questa sicurezza impostando i cookie di Discourse su samesite=None.

  2. L’uso di una richiesta POST senza un token CSRF attiva anche un’altra misura di sicurezza nel core.

    Un workaround INSECURO consiste nel rimuovere questa riga.

  3. Stavo ricevendo un errore 403 da Apple quando il gem omniauth recuperava i JWK. Sospetto che l’intestazione Accept: non venga impostata correttamente, ma non l’ho ancora verificato.

    Un workaround INSECURO è stato quello di hardcodare le chiavi.

Dopo tutto questo, sono finalmente riuscito ad accedere con Apple. Puoi provarlo su https://sandbox.dtaylor.uk (lo lascerò funzionante per qualche giorno, ma per favore non inserire dati sensibili perché è INSECURO).

E poi… le email e i nomi vengono inclusi solo nella prima autenticazione. Puoi provarlo: accedi con Apple, annulla la creazione dell’account e riprova. Il secondo tentativo non includerà i tuoi dettagli.

Quindi, supponendo che Apple non cambi le cose a breve… come potremmo far funzionare tutto questo?

Per (1) e (2) penso che potremmo convertire il POST di Apple in un GET senza compromettere la sicurezza. Quando riceviamo un POST sul callback, renderizziamo un JavaScript che imposta window.location='/auth/apple/callback?code=...&state=...'. Da lì, funzionerebbe esattamente come qualsiasi altro provider. Tuttavia, penso che intercettare il POST richiederebbe alcune modifiche all’API core.

Per (3), penso che potrebbe essere risolto con un po’ di lavoro sul gem omniauth.

Ma siamo comunque bloccati senza nome/email, quindi non sono sicuro che valga la pena risolvere questi altri problemi :cry:

8 Mi Piace