ios swift oauth sfauthenticationsession

ios - SFAuthenticationSession/ASWebAuthenticationSession y cierre de sesión



swift oauth (4)

Estoy planeando cambiar una aplicación del antiguo flujo de OAuth con el SFSafariViewController al nuevo flujo con la SFAuthenticationSession iOS 11. Iniciar sesión no es un problema, la transferencia a la nueva API me tomó unos minutos para implementarla. Sin embargo cerrar la sesión me ha desconcertado.

¿Cómo?

No puedo encontrar ninguna mención de querer ofrecer la opción de cerrar sesión en cualquier lugar en los documentos. ¿Usando el antiguo SFSafariViewController para invalidar las cookies? No, ya no se comparten con SFAuthenticationSession . Tan pronto como reinicie la sesión de autenticación, el usuario inicia sesión automáticamente y no hay salida. Entonces, ¿cómo habilitar el cierre de sesión? ¿O simplemente estoy pasando por alto algo completamente obvio?

Actualización: encontré una "manera que funciona" en un sentido técnico, pero es una locura para el usuario: abrir una nueva SFAuthenticationSession en la página de cierre de sesión que borra la cookie. Pero eso significa que al cerrar sesión, la vista de alerta le pregunta al usuario si desea iniciar sesión a través del servicio. Si se selecciona ("iniciar sesión"), se abre la página de cierre de sesión de eliminación de cookies, el usuario tiene que cerrar manualmente la vista, que puede ser capturada por el controlador de finalización y sabemos que podemos abrir la vista de inicio de sesión nuevamente. ¿Inicia sesión para iniciar sesión? Realmente no me gusta esta solución.

¿Algunas ideas? ¿Todavía estoy pasando por alto una solución completamente obvia?

Actualización 2: como nadie tiene ni idea de este problema hasta ahora, probablemente no sea una tarea fácil. He presentado una sugerencia con Apple a través de su herramienta de informes para aclarar cómo manejar esto o incorporarlo en la API si no está disponible. Publicaré si recibo una respuesta.

Actualización 3: Después de reflexionar un poco más sobre el problema, encontramos otra solución posible (aunque también poco atractiva) si puede influir en la página de inicio de sesión del proveedor de OAuth: crear cookies de muy corta duración. Luego, la página de inicio de sesión se puede abrir sin inicio de sesión automático. Sin embargo, esto elimina el propósito de compartir sesiones de inicio de sesión entre aplicaciones ... y debe poder influir en la página de inicio de sesión.

Actualización 4: Dado que iOS 12 SFAuthenticationSession está en desuso y fue reemplazado por ASWebAuthenticationSession . Sin embargo, ASWebAuthenticationSession no cambia nada con respecto al ASWebAuthenticationSession de sesión. Todavía no es posible. El mismo problema que antes.


Cuando cierre la sesión con SFAuthenticationSession, no obtendrá el controlador de finalización. Solo obtendrá el controlador de finalización de la cancelación, que es igual para la alerta de permiso y para el botón de cancelación en el Controlador de vista de autenticación


Esto es algo que también nos molesta. ¿Por qué no hay ningún método como "borrar todas las cookies" en la sesión? Esto resolvería este problema completamente. Y también permanecería seguro, ya que no obtendrá acceso a las cookies en sí.

Presionando esto y esperando que haya una solución provista por Apple para esto.

@Posters debajo de ASWebAuthenticationSession no es un reemplazo, es más bien un cambio de nombre de SFAuthenticationSession hasta ahora. No veo ninguna razón por la que Apple no proporcione un método ClearSession o ClearCookies para nosotros. ASWebAuthenticationSession o SFAuthenticationSession son completamente inútiles a menos que agreguen cualquier flujo de trabajo para cerrar la sesión de una sesión existente.


Una de las "mejores" soluciones que he encontrado es abrir una página de cierre de sesión en el sistema Safari (no un SFSafariViewController ). Debido a que ASWebAuthenticationSession comparte las cookies de manera confiable con Safari, la cookie expirada / eliminada también afecta a la aplicación.

Vea esta página de GitHub para más detalles.