Me gusta la forma en que OAuth / OpenID puede autenticar / identificar a un usuario de otro dominio, pero solo si el otro dominio lo permite (presumiblemente en las instrucciones del usuario).
Me gustaría hacer algo similar, pero utilizando CORS AJAX o una alternativa como JSONP. El problema es que cuando se usa un redireccionamiento de página completa, el "dominio de inicio de sesión" puede estar seguro de a qué dominio le está suministrando el auth_token / info, porque está emitiendo un propio redireccionamiento HTTP. Sin embargo, eso no es cierto para JSONP.
Mis pensamientos actuales están abajo, y mis preguntas son:
- ¿Cuáles son las debilidades en este patrón?
- ¿Hay una forma de hacerlo sin dos solicitudes separadas (para el caso que no es CORS)?
Caso general:
EDITAR: esta sección originalmente asumió una solicitud JSONP; de hecho, creo que podría ser cualquier tipo de datos
Caso A : el usuario ha iniciado sesión en el "dominio de inicio de sesión" (mediante cookies)
- El cliente realiza una solicitud al "dominio de inicio de sesión", proporcionando una URL en el "dominio de servicio"
- El servidor de inicio de sesión mira la URL suministrada y piensa "sí, está bien", y devuelve una respuesta de redireccionamiento HTTP (3XX) que incluye un auth_token / cualquiera en la URL
- El cliente sigue la redirección al dominio de servicio. El dominio de servicio almacena el auth_token / lo que sea en la sesión, y devuelve un recurso estático (por ejemplo, una imagen)
- El cliente realiza una segunda solicitud al dominio de servicio (no se permite el origen cruzado) para recuperar el auth_token / lo que sea.
Caso B : el usuario no ha iniciado sesión en el "dominio de inicio de sesión" o no ha autorizado compartir detalles con el "dominio de servicio".
- El cliente realiza una solicitud al "dominio de inicio de sesión", proporcionando una URL en el "dominio de servicio"
- El servidor de inicio de sesión devuelve una respuesta de Redireccionamiento HTTP (3XX) que incluye un estado "no autorizado" en la URL (o tal vez la URL de un inicio de sesión de estilo OAuth de página completa)
- El cliente sigue la redirección al dominio de servicio. El dominio de servicio almacena el estado "no autorizado" en la sesión, devolviendo un recurso estático al cliente.
- Luego, el cliente realiza una segunda solicitud al dominio de servicio (no se permite el origen cruzado) para descubrir que la autorización / identificación ha fallado.
Caso C : otro sitio que intenta inspeccionar el estado de inicio de sesión
- El usuario navega al sitio dudoso
- El cliente realiza una solicitud al servidor de inicio de sesión, suministrando una URL en el actual dominio de servicio
- El servidor de inicio de sesión redirige a alguna página en el dominio de servicio real, que devuelve un resultado estático
- El usuario puede o no haber iniciado sesión, pero el cliente no puede averiguarlo porque la restricción de origen cruzado prohíbe el punto final del "dominio de servicio" que le indicaría que está prohibido.
CORS AJAX case
Si el punto final del "servidor de inicio de sesión" tiene CORS habilitado, entonces la solicitud podría realizarse como una solicitud AJAX. Si el punto final del "dominio de servicio" no tiene CORS habilitado, el resultado final de esta solicitud AJAX podría ser en realidad un eco de auth_token / lo que sea, en lugar de requerir una segunda solicitud.
- El cliente realiza una solicitud de CORS AJAX al "dominio de inicio de sesión", proporcionando una URL en el "dominio de servicio"
- El servidor de inicio de sesión devuelve una respuesta de redireccionamiento HTTP (3XX) que incluye el auth_token / failure / lo que sea en la URL
- El cliente sigue la redirección al dominio de servicio.
- El dominio de servicio devuelve un documento que contiene toda la información proporcionada en la URL (auth_token / whatever).
De hecho, este comportamiento de "eco del símbolo de autenticación" podría incluso usarse en lugar del recurso estático de la sección anterior, por lo que admite ambos modelos con el mismo punto final.