2016-10-28 1 views
1

Laravel 5.3 응용 프로그램에서 AJAX를 사용하는 응용 프로그램이 있습니다. 인증 뒤에 있고 인증되지 않은 페이지가 있습니다. 인증 내부에있는 것들이 잘 작동하고 있습니다. 밖에있는 사람 (공개 대면)은 나에게 악명 높은 TokenMismatchException in VerifyCsrfToken.php line 68을줍니다. AJAX와 헤더에 토큰을 연결하기 위해, 나는 ...다른 Laravel Token Mismatch 예외 문제

$.ajaxSetup({ 
    cache: false, 
    async: true, 
    headers: { 
     'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') 
    } 
}); 

을이 사용하고 내가 요청을 할 때, 나는이 볼 수 있기 때문에 ... enter image description here

을하고있다. ..하지만 토큰이 일치하지 않습니다. 프레임 워크 파일 Illuminate\Foundation\Http\Middleware\VerifyCsrfToken::class에 가서 세션 토큰 및 전달 된 토큰에 dd()을 수행하면 일치하지 않습니다.

것들 내가 시도 :

  1. 지우기 캐시 (뷰, 설정, 캐시)
  2. 대신 AJAX 헤더의 csrf_field()을 사용하여 레디 스에 파일에서 세션 드라이버를 변경

왜 이것이 작동하지 않는지 나는 알 수 없다. 다른 아이디어?

+0

쿠키에서 CSRF-TOKEN과 XSRF-TOKEN을 면밀히 살펴보면 동일하지 않습니다. 따라서 토큰이 일치하지 않는 이유 중 하나 일 수 있습니다. – Samundra

+0

@Samundra 프레임 워크는 헤더를 'X-CSRF-TOKEN'으로 찾습니다. 또한 다른 페이지에서도 작동합니다. ? '를 분명히 \ 재단 \ HTTP를 미들웨어 \ VerifyCsrfToken \ :: class' '$ 토큰 = $ 요청 -> 입력 ('_ 토큰') : $ 요청 -> 헤더 ('X-CSRF 토큰'); ' – dericcain

+0

Laravel은 임의의 문자열에서 생성 된 토큰을 세션에 저장하는 것처럼 보입니다. 그런 다음 각 요청에 대해 전달 된 토큰을 세션에서 생성 된 토큰과 비교합니다. 현재 라우트중인 경로가'routes'/web.php' 세션을 적절하게 설정하는'web' 미들웨어 그룹 뒤에 있는지 확인하십시오. – user3158900

답변

0

그리고 마침내 알아 냈습니다. 나는 모든 요청을 localhost:3000/*으로 프록시하는 livereload에 BrowserSync를 사용하고 있습니다. 공용 측을 테스트 할 때 원래 도메인 이름을 통해 방문했지만 browsersync의 localhost:3000을 통해 프록시하지 않아 세션 문제를 일으켰습니다.

기본적으로 BrowserSync를 실행 중이고 browsersync를 통해 사이트를 사용하려고 시도하면 토큰 불일치 오류가 발생할 수 있습니다.

0

당신이 laravel Github Link

/** 
* Determine if the session and input CSRF tokens match. 
* 
* @param \Illuminate\Http\Request $request 
* @return bool 
*/ 
protected function tokensMatch($request) 
{ 
    $sessionToken = $request->session()->token(); 

    $token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN'); 

    if (! $token && $header = $request->header('X-XSRF-TOKEN')) { 
     $token = $this->encrypter->decrypt($header); 
    } 

    if (! is_string($sessionToken) || ! is_string($token)) { 
     return false; 
    } 

    return hash_equals($sessionToken, $token); 
} 

그것은 X-CSRF-TOKEN 확인하고 또한 X-XSRF-TOKEN를 확인하기 위해 시도의이 코드를 보면. ajax에서 _token을 보낼 수도 있습니다. 나는 이것이 당신을 돕기를 바랍니다.

+0

그들이 사용하는 코드는 docs에서 가져온 것입니다. https://laravel.com/docs/5.3/csrf – Samsquanch

+0

@Samsquanch 예, 제 질문에, 제가 말했던 때입니다. 프레임 워크 파일 \ Foundation \ Http \ Middleware \ VerifyCsrfToken :: class를 조명하고 전달 된 토큰과 세션 토큰에서 dd()를 수행하면 일치하지 않습니다. 정확한 방법입니다. 나는 무엇이 없는가. – dericcain

+0

코드가'! $ token && $ header = $ request-> header ('X-XSRF-TOKEN')'? – Samundra