2014-01-10 1 views
1

내가 다음이 파일과 일치하지 않습니다 행동이 이루어지는 곳. UserController 내부에서이 방법은 표준 Laravel 블레이드 템플릿을 사용 어떤 패키지 로그인 폼 게시물을 처리합니다Laravel 4 인증 토큰은 필터에

블레이드 파일 :

{{ Form::open(['url' => 'user/signin']) }} 
{{ Form::token() }} 
    <div class="form-group"> 
     <label>{{ trans('user.email') }}</label> 
     <input type="email" name="email" value="" class="form-control"> 
    </div> 

    <div class="form-group"> 
     <label>{{ trans('user.password') }}</label> 
     <input type="password" name="password" value="" class="form-control"> 
    </div> 

    <input type="submit" class="btn btn-primary" value="{{ trans('login') }}"> 
       {{ Form::close() }} 

이이 UserController 포스트 작업입니다 :

public function postSignin() 
{ 
    // 
    if (Auth::attempt(['email' => Input::get('email'), 'password' => Input::get('password')])) 
    { 
     return Auth::user()->email; 
    } 
    else 
    { 
     return Redirect::to('user/login')->with('message', trans('login.failure')); 
    } 
} 

이 파일은 내가 사용하는 이전 파일입니다.

public function up() 
{ 
    // 
    Schema::create('users', function ($table) { 
     $table->increments('id'); 
     $table->string('email', 16)->unique(); 
     $table->string('password', 255); 
     $table->timestamps(); 
    }); 
} 

하지만 로그 할 때

Illuminate \ Session \ TokenMismatchException 

filters.php 파일에 던져 :

Route::filter('csrf', function() 
{ 
    if (Session::token() != Input::get('_token')) 
    { 
     throw new Illuminate\Session\TokenMismatchException; 
    } 
}); 

내가 잘못 뭐하는 거지에, 나는 예외가? Auth ::는 해시로 암호를 해독합니까? root 사용자를 생성하는 데 사용되는 Seeder에서 Hashed입니다. Session :: token()을 덤프하면 Form :: token()과 동일하지만 여전히 filters.php 파일 내에서 TokenMismatchException이 발생합니다.

업데이트 실제로 토큰을 볼 수 있도록하기 위해 csrf 필터가 비활성화되었습니다. 양식을 제출하기 전에 두 개의 토큰 Session :: token()과 Form :: token()이 동일하다는 것을 HTML 소스 코드를보고 확인했습니다. postSignin 메서드 내에서 dd()를 사용하여 양식을 제출하고 토큰을 덤프 할 때 Session :: token()이 변경되었습니다. 더 이상 HTML 소스 코드에 표시된 Session :: token()과 동일하지 않습니다.

return array(
    'driver' => 'array', 
); 

로컬 폴더의 세션 구성.

+0

또한 블레이드 파일을 게시하십시오.'{{Form :: open()}} '을 사용하면 csrf 숨김 필드가 자동으로 추가됩니다. 사용자가 직접 폼을 만든 경우 폼을 추가하지 않는 한 그렇지 않습니다. 하지만 우리는 당신이 그것을 어떻게 포맷 하는지를 볼 필요가 있습니다. – Luceos

+0

@Luceos 블레이드 파일이 추가되었습니다. 표준 블레이드 템플릿, csrf가 자동으로 설정됩니다. –

+0

오, 알았어. 이 오류는 "바닐라"라고합니다. – Luceos

답변

1

참고 - 이것은 인증 문제가 아니며 로그인 인증과 관련이 없습니다.

이것은 양식 제출 때문에 CSRF 토큰과 관련이 있습니다. 코드의 어딘가에서 CSRF 필터를 호출해야합니다. 문제를 해결해야한다 양식이 추가

:

{{ Form::open(['url' => 'user/signin']) }} 
    {{ Form::token() }} 

    .... /// rest of form stuff here 

{{ Form::close() }} 

편집 : 세션 구성도 정확한지 확인하십시오. 'array'로 설정하면 작동하지 않습니다. '파일'또는 다른 옵션이어야합니다.

+0

이것을 로그인 폼에 추가했지만 여전히 TokenMismatchException이 발생합니다. 페이지의 소스 코드 확인 Form :: token()을 추가 할 때 2 개의 동일한 토큰을 얻습니다. 이미 Laravel이 추가했습니다. –

+0

세션에 문제가 있습니까? 세션 구성은 무엇입니까? – Laurence

+2

세션이 배열로 설정되었지만 요청간에 동일하지 않은 것은 당연합니다. –

0

암호를 해시하는 것이 해결책이라는 것을 깨닫고 난 뒤 주위를 둘러 보았습니다. Laravel 4.1에서는 Auth가 작동하도록 비밀번호를 해시해야합니다.

DB 시더의 암호에 해시를 추가하면 로그인 할 수 있습니다.