Ich habe versucht, unseren Fork des Plugins auf die neueste Version von omniauth-apple zu aktualisieren. (Beachte, dass dafür weitere Änderungen erforderlich sind, nicht nur eine Versionsnummer-Erhöhung).
tl;dr: Es funktioniert immer noch nicht.
Ich habe es in meiner Sandbox durch Hacken zum Laufen gebracht, aber es gibt immer noch mehrere Probleme:
-
Apple verwendet bei der Rückrufaktion (Callback) eine POST-Anfrage. Das ist bei OAuth-Implementierungen unüblich, da dies bedeutet, dass Cookies mit
samesite=Laxnicht mit der Anfrage gesendet werden. Das führt dazu, dass Discourse die Sitzungs-Cookies während des Callbacks nicht lesen kann und daher einen CSRF-Fehler wirft.UNSICHERE Workaround-Lösung: Deaktivieren dieser Sicherheit, indem die Discourse-Cookies auf
samesite=Nonegesetzt werden. -
Die Verwendung einer POST-Anfrage ohne CSRF-Token löst eine weitere Sicherheitsmaßnahme im Kern von Discourse aus.
UNSICHERE Workaround-Lösung: Entfernen dieser Zeile.
-
Ich erhielt von Apple eine 403-Fehlermeldung, als das omniauth-Gem die JWKs abrufte. Ich vermute, dass der
Accept:-Header nicht korrekt gesetzt wird, habe das aber noch nicht überprüft.UNSICHERE Workaround-Lösung: Die Schlüssel manuell fest codieren.
Nach all dem konnte ich mich schließlich mit Apple anmelden. Du kannst es auf https://sandbox.dtaylor.uk ausprobieren (ich lasse es einige Tage funktionieren, aber bitte gib dort keine sensiblen Daten ein, da es UNSICHER ist).
Und dann… E-Mails und Namen werden nur beim ersten Authentifizierungsvorgang übermittelt. Du kannst das testen: Melde dich mit Apple an, brich die Kontoeinrichtung ab und versuche es erneut. Beim zweiten Versuch fehlen deine Daten.
Angenommen, Apple wird die Dinge in absehbarer Zeit nicht ändern… wie könnten wir das zum Laufen bringen?
Für (1) und (2) könnten wir das POST von Apple in ein GET umwandeln, ohne die Sicherheit zu beeinträchtigen. Wenn wir eine POST-Anfrage beim Callback erhalten, rendern wir etwas JavaScript, das window.location='/auth/apple/callback?code=...&state=...' setzt. Von dort aus würde es genau wie bei jedem anderen Anbieter funktionieren. Allerdings würde das Abfangen der POST-Anfrage wahrscheinlich einige Änderungen an der Kern-API erfordern.
Für (3) könnte das Problem wahrscheinlich mit etwas Arbeit am omniauth-Gem behoben werden.
Aber wir stecken immer noch ohne Namen/E-Mail fest, daher bin ich mir nicht sicher, ob es sich lohnt, diese anderen Probleme zu beheben ![]()