Yo voy a enviar un AJAX solicitud post de vuelta a mi Laravel API y recibiendo este error messsage:

DecryptException en compiled.php línea 13235:
La carga no es válido.

Estoy leyendo el XSRF-símbolo de la cookie y el envío de que a lo largo como un encabezado de solicitud nombre X-XSRF-TOKEN.

El sitio es completamente independiente del sitio de la Laravel API, pero comparte el mismo período de sesiones, que es la razón por la que estoy recibiendo el valor de una cookie.

Lo extraño es, en ocasiones funciona. Cualquier idea de lo que está causando esto?

  • Se le envía XSRF-TOKEN o X-CSRF-TOKEN?
  • Estoy enviando un nombre de encabezado: X-XSRF-TOKEN, el valor de la cookie denominada XSRF-TOKEN
  • Enviar el X-CSRF-TOKEN encabezado. El XSRF-TOKEN cookie no está cifrada, pero laravel espera que el X-XSRF-TOKEN cabecera de cifrado.
  • Retirada de este post que te puede ayudar stackoverflow.com/questions/42408177/…
  • Lo único que tengo disponible para el uso de las cookies es XSRF-TOKEN y parece ser cifrados, he aquí un ejemplo de valor: eyJpdiI6Ikd1SFlHaGdLcFwvY0NWR2tRumu0bk9rpt0ilcj2ywx1zsi6iluwqlfmastvy3fxv0owde8xukv0cdf4zmfar21kbdjttuvyn3zsrk1fzfwvehoxmwr6ouz3u0t1ue81mlwvbhntcmz0vljhunpqejhcblhxmvrqwfv6umc9psisim1hyyi6imiyyzjkmzgxmtmxogfiodg3mtiyyzhmzje0nmfjzwuzzjg0mtmzyzblztkwngfmmzfjndy3ztc5zgvkymrjmjkifq%3D%3D
  • La laravel token CSRF es un valor cifrado de hecho, pero laravel no es necesario descifrar para verificar porque ya se sabe lo que el valor cifrado está destinado a ser. Es por eso que usted debe enviar en el X-CSRF-TOKEN de cabecera porque entonces se acaba de verificar que sea correcta.
  • La documentación indica esto: Laravel también almacena el token CSRF en un XSRF-TOKEN cookie. Usted puede utilizar el valor de la cookie para establecer el X-XSRF-solicitud de TOKEN de encabezado. Algunos de los frameworks de JavaScript, como Angular, hacer esto de forma automática para usted. – Esto es exactamente lo que estoy haciendo.

InformationsquelleAutor ezero | 2017-06-20

3 Comentarios

  1. 7

    Si usted está enviando X-XSRF-TOKEN de JavaScript, se puede decodificar el uso de decodeURIComponent(). Convierte %3D a =.

  2. 3

    He encontrado la causa del problema. El XSRF-TOKEN el valor de la cookie a veces había un pícaro de caracteres anexada al final: ‘%3D’ – a veces hay dos de estas en la final. Ni idea de cómo llegar allí, pero cuando están presentes, la verificación falla.

    Si base64_decode el valor de la cookie, se obtiene una cadena json que tiene el pícaro personaje: ‘7’ que se anexa al final para Laravel es descifrar método falla.

    Terminé de escribir mi propio CSRF verificar la función:

    $payload = base64_decode($request->header('X-XSRF-TOKEN'));
    
                //Remove any rogue chars from the end of the json  
                for($i=0; $i<strlen($payload); $i++){
                    $lastChar = substr($payload, -1);
                    if($lastChar != '}'){
                        $payload = substr($payload, 0, -1);
                    } else {
                        break;
                    }
                }
    
                //Needs to be base64 encoded when passed to decrypt
                $payload = base64_encode($payload);
    
                $headerToken = decrypt($payload);
                $cookieToken = $request->cookie('XSRF-TOKEN');
    
                //Compare tokens
                if($headerToken == $cookieToken){
                    return true;
                } else {
                    return false;
                }
    • también estoy recibiendo de este extraño personaje se adjunta al final de mi XSRF-TOKEN el valor de la cookie. Alguien sabe cuál es la causa de esto?
  3. 0

    Tuve un problema similar, pero parece estar relacionada sólo con Google Chrome. He modificado EncryptCookies a dd() una vez que se encontró una descifrar excepción:

    protected function decrypt(Request $request)
    {
        foreach ($request->cookies as $key => $c) {
            if ($this->isDisabled($key)) {
                continue;
            }
    
            try {
                $request->cookies->set($key, $this->decryptCookie($c));
            } catch (DecryptException $e) {
                dd('exception: ', $e, $key, $c, $request); //added by me
                $request->cookies->set($key, null);
            }
        }
    
        return $request;
    }

    Extrañamente, cada vez que actualice la página, a veces la DecryptException es lanzado pero la mayoría del tiempo la instrucción try se realiza correctamente. Cuando puedo probar en IE y Firefox, la instrucción try siempre tiene éxito. Parece relacionado con la cantidad de datos en mi encabezados de solicitud, pero el problema no es determinista.

Dejar respuesta

Please enter your comment!
Please enter your name here