php - configuración - La sesión se pierde después de una redirección de OAuth
configurar oauth2 moodle (4)
¿Por qué no comprueba que la identificación de la sesión es isset o no mientras está en el caso de que no esté configurada o podemos decir que es diferente del servidor? y otra forma es, si establecemos nuestra variable de sesión en una variable temporal, de modo que mientras esté en blanco, esto se agregue a nuestra variable de sesión.
Yo uso CakePHP 2.4. Tengo un inicio de sesión de OAuth en mi sitio web. % 99.5 de firmas son exitosas pero% 0.5 falla. Tengo este error por meses. Probé muchas cosas para depurar y registrar, pero aun así no resolví el problema. Aunque la mayoría de las solicitudes son buenas, necesito resolver la parte pequeña.
El escenario es así:
- El usuario hace clic en el botón Iniciar sesión
- Recibo token de solicitud del servidor (por ejemplo, yahoo, twitter)
-
oauth_token
en la sesión del usuario
por ejemplo, la ID de sesión esaaa1234
CakePHP crea la cookie PHPSESSID y guarda la identificación de la sesión en esta cookie.
Redirijo al usuario al servidor de Twitter y el usuario confirma mi aplicación
- El usuario llega a mi sitio web con oauth verifier
a) Utilizooauth_token
yoauth_verifier
del usuario y obtengoaccess_tokens
. ID de sesión esaaa1234
. todo bien.
b) Fracaso. Porque no puedo encontrar eloauth_token
del usuario en la sesión actual. Cuandobbb2345
ID de la sesión, veo que la ID ha cambiado, ID ahora esbbb2345
Para el escenario b:
Parece que el usuario tiene una nueva ID de sesión ahora. oauth_token
no se puede encontrar en una sesión nueva. Pero tenga en cuenta que existen datos de sesión antiguos en la carpeta /tmp/sessions/
.
La cookie de ID de sesión no existe para la sesión aaa1234
. Pero otra cookie de seguimiento que establecí hace 2 días existe en las cookies.
Reviso los agentes de usuario.
Es lo mismo cuando llega el usuario por primera vez y el usuario regresa del servidor de Yahoo.
Este escenario de falla ocurre en Chrome, Firefox, navegadores móviles u otros navegadores, por lo que no puedo acusar el tipo de navegador.
¿Qué debo verificar más para diagnosticar?
Mi configuración de CakePHP core.php:
Configure::write(''Session'', array( ''defaults'' => ''cake'' ));
Configure::write(''Session.cookie'', ''MYPHPSESSID'');
Configure::write(''Session.timeout'', 120);
Configure::write(''Security.level'', ''medium'');
Otras configuraciones son predeterminadas como se menciona en el archivo: https://github.com/cakephp/cakephp/blob/2.5/app/Config/core.php#L182
Editar: Al usar esta respuesta , busqué las cookies. El 20% de los usuarios erróneos inhabilitaron las cookies. Le pregunté personalmente y la opción de cookie confirmada por el usuario. Pero parece que otros usuarios no desactivaron las cookies. También algunos usuarios llegan a mi sitio web usando Android WebViews. En los clientes de WebView, estoy seguro de que no desactivo las cookies. Además, el 99% de los usuarios de WebView pueden usar el sitio web con éxito.
Escriba esto al comienzo de todos sus controladores:
!session_id() ? session_start() : '''';
No estoy seguro de por qué pero me he enfrentado al mismo problema yo mismo. Descubrí que el ID de la sesión se pierde de alguna manera cuando se utiliza el redireccionamiento de OAuth en CakePHP. La línea anterior asegura que siempre existe una identificación de sesión. Espero que esto ayude.
Me imagino que CBroe tiene el dinero aquí. Me he encontrado con esto antes también (no específicamente con OAuth, pero con otros redireccionamientos que configuran una cookie de sesión).
Más información aquí: Perder variables de sesión después de redirigir
Su ID de sesión podría perderse debido a una redirección entre esquemas . En caso de que su usuario recibiera una identificación de sesión en HTTP y luego regresara a HTTPS (o viceversa) su sesión se perdería / sería reemplazada por una sesión anterior que tenía previamente en ese esquema.
Esto no es 100% seguro, pero si fuera usted, intentaría darle un vistazo (me pasó a mí también en un proyecto anterior).
EDITAR
Explicación:
Los clientes obtienen su sesión en HTTP , son redirigidos para fines oauth, y cuando vuelven, vienen a través de HTTPS .
Las sesiones normales de PHP ($ _SESSION) se pierden cuando se mueve entre HTTP y HTTPS . La sesión en sí se mantiene en el lado del servidor, pero el cliente pierde session_id, por lo que el servidor no lo reconoce y la sesión se pierde, por lo que estaba usando PHP puro, el 100% de sus clientes iban a perder sesión en su camino espalda.
CakePHP maneja este problema común a través de cookies que guardan la identificación de sesión, y luego cuando el cliente vuelve sin session_id en los encabezados de solicitud, su sesión se restaura debido a la cookie. El 0.05% de sus clientes que falla, son clientes con uno (o más) de los siguientes:
- Cookies deshabilitadas (más comunes)
- Navegadores que no retienen cookies del mismo sitio web al cambiar entre HTTP / HTTPS (mucho más raro)
Soluciones posibles:
Inicialice la cookie en HTTPS para comenzar (es decir, primero compruebe si el usuario está en HTTP, luego redirigirlo a HTTPS, luego inicie la sesión y luego redirigirlo a oauth endpoint) - Personalmente lo recomiendo.
algunos proveedores de Oauth toman parámetros para que la URL redirija al usuario cuando finaliza su autenticación. Puede usar esto y enviar su id de sesión como un parámetro. - No lo recomiendo, porque entonces podrías exponer el id. De sesión de tu cliente a los atacantes.
¡Buena suerte!