He intentado actualizar nuestro fork del plugin para usar la última versión de omniauth-apple. (Tenga en cuenta que se requieren algunos otros cambios, no solo actualizar el número de versión).
tl;dr: sigue sin funcionar
Logré hacerlo funcionar con un parche en mi entorno de pruebas, pero aún presenta varios problemas:
-
Apple utiliza una solicitud POST en la devolución de llamada. Esto no es común en las implementaciones de OAuth porque significa que las cookies con
samesite=Laxno se enviarán con la solicitud. Esto implica que Discourse no puede leer las cookies de sesión durante la devolución de llamada y, por lo tanto, lanza un error CSRF.La solución INSEGURO es desactivar esta medida de seguridad cambiando las cookies de Discourse a
samesite=None. -
El uso de una solicitud POST sin un token CSRF también activa otra medida de seguridad en el núcleo.
La solución INSEGURO es eliminar esta línea.
-
Recibía un error 403 de Apple cuando la gem de omniauth obtenía los JWKs. Sospecho que el encabezado
Accept:no se está configurando correctamente, pero aún no lo he verificado.La solución INSEGURO fue codificar las claves de forma manual.
Después de todo eso, finalmente pude iniciar sesión con Apple. Puede probarlo en https://sandbox.dtaylor.uk (lo dejaré funcionando durante unos días, pero por favor no introduzca información sensible allí, ya que es INSEGURO).
Y luego… los correos electrónicos y nombres solo se incluyen en la primera autenticación. Puede probarlo: inicie sesión con Apple, cancele la creación de la cuenta y luego intente nuevamente. El segundo intento no incluirá sus datos.
Así que, suponiendo que Apple no vaya a cambiar nada pronto… ¿cómo podríamos hacer que esto funcione?
Para (1) y (2), creo que podríamos convertir la solicitud POST de Apple en una GET sin comprometer la seguridad. Cuando recibimos una POST en la devolución de llamada, renderizamos un script de JavaScript que establece window.location='/auth/apple/callback?code=...&state=...'. A partir de ahí, funcionaría exactamente como cualquier otro proveedor. Sin embargo, creo que interceptar la POST requeriría algunos cambios en la API central.
Para (3), creo que probablemente se podría solucionar con un poco de trabajo en la gem de omniauth.
Pero seguimos atascados sin obtener el nombre y el correo electrónico, así que no estoy seguro de si vale la pena solucionar estos otros problemas ![]()