Implemento SSO para integrar algún mecanismo de inicio de sesión web al sistema miembro centralizado que es el proveedor OAuth2. Y actualmente la autorización OAuth2 funciona bien.
Sin embargo, me gustaría implementar métodos de inicio de sesión mucho más suaves mediante la llamada AJAX. Por ejemplo, el usuario ha iniciado sesión en la web A y el sistema miembro ya. Cuando el usuario navega a la web B, la web B debería llamar a AJAX al sistema miembro para ver si el usuario inició sesión o no. Si el usuario inició sesión, la web B debería mostrar al usuario la página de inicio de sesión.
He estudiado algunos de los artículos de OAuth2 (no puedo encontrar el enlace ahora). Todos hacen SSO por redireccionamiento al proveedor de OAuth directamente. Sin embargo, me gustaría usar la llamada CORS AJAX porque podría proporcionar una mejor UX.
Leí otra discusión sobre el riesgo de CORS y SSO: ¿Diseñar el inicio de sesión único con JSONP / CORS?
Pero no puedo entender la respuesta seleccionada.
Debe haber un control establecido para evitar un JavaScript malicioso cliente de falsificar las interacciones con el servidor de autorizaciones. Si La URL se proporciona como un argumento dentro de una solicitud CORS Ajax, en lugar de luego, verificando el encabezado de origen HTTP, entonces un cliente malicioso es permitido mentir sobre su contexto.
La URL podría ser verificada por el encabezado CORS Origen.
Mi opinión es que si OAuth2 Provider establece CORS Origin correctamente, debería estar bien para admitir el mecanismo de inicio de sesión de CORS AJAX. Debido a que las cookies y CORS no pueden acceder por dominio cruzado y violar la estrategia de Origen CORS, no sufriría el ataque CSRF. Solo tienes que preocuparte por XSS.
No tengo mucha confianza en mis opiniones, por eso publico aquí. Si tiene algún consejo o encuentra mi error, hágamelo saber.
[Actualizar más detalles]
En el sistema miembro, definiría la configuración de CORS como esta
app.use(cors({
origin: ["http://weba.com", "http://webb.com"],
credentials: true,
methods: ['GET', 'POST']
}))
app.get('/sniff', (req, res)=>{
if(req.session.user){ res.send("user login")}
else res.send("not login yet")
})
En la webA,
xhr.withCredential = true
xhr.open("GET","http://member.com/sniff") => I can tell if user login or not.