laravel 4: por que Request :: header () não está recebendo o header especificado?

Estou tentando obter um valor de header com:

Request::header('csrf_token')

no entanto, meu firebug diz nos headers que eu tenho o csrf_token configurado para baMDpF0yrfRerkdihFack1Sa9cchUk8qBzm0hK0C . Na verdade, eu posso obter esse csrf_token vez disso com um código php nativo:

getallheaders()['csrf_token']

Agora, a questão é que eu estou fazendo o meu direito de proteção XSRF? ou talvez haja uma falha naquele código php que eu fiz, que eu realmente tenho que usar o buggy laravel 4 function

Request::header('csrf_token')

que não retorna nada em branco. E acabei de perder alguma coisa. talvez nas configurações do Laravel 4, etc.?

PS: Estou usando o AngularJS, mas talvez não seja importante o que eu usei. Eu tenho esse link como meu guia: como enviar csrf_token () dentro do formulário AngularJS usando a Laravel API?

Eu resolvi o problema removendo o sublinhado ‘_’ em csrf_token para que ele fosse crsftoken em vez disso.

 Request::header('csrf_token'); // Not working Request::header('csrftoken'); // Working! 

Eu acho que o problema é que na seguinte resposta em Como enviar csrf_token () dentro do formulário AngularJS usando Laravel que você usou, o csrf_token não é enviado no header do seu XMLHttpRequest, mas na forma que ele próprio.

Você precisa, em seguida, filtrá-lo no seu backend laravel como um campo de input regular. Veja abaixo um exemplo de trabalho:

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

ATUALIZAR

Se você quiser usar headers em Angular, prefira escrever algo como:

 $httpProvider.defaults.headers.common['Authorization'] = TOKEN; 

Para aplicar um novo header para o XMLHttpRequests. Então é facilmente acessível mesmo com php bruto, tais como:

 $aHeaders = getallheaders(); if (Session::token() != $aHeaders['authorization']) etc. 

Request::header() é de fato usado para a recuperação de headers , mas verifique onde o token está sendo configurado .. o token CSRF deve ser colocado na session por Laravel e, em seguida, pode ser acessado através do Session::token() método.

Se você olhar para o HTML gerado através de chamadas para a class Form:: , você verá um elemento oculto chamado _token , que deve ser comparado ao token na session. Você pode acessar isso usando Input::get('_token') , como com qualquer outra variável GET ou POST recebida.

… No entanto, tudo isso não deve ser realmente necessário, pois pode ser gerenciado facilmente através do filtro CSRF pré-definido em filters.php , basta adicionar esse filtro à rota ou grupo de rota desejado e você será protegido, sem ter que entrar nos detalhes dele.

Problema

Laravel está removendo headers com um sublinhado no nome ao recuperá-los com o método Request::header() . Além disso, todos os nomes de header são convertidos em minúsculas no método Request::header() .

Solução curta

No frontend, substitua todos os sublinhados em nomes de header com traços. csrf_token torna csrf-token se csrf-token

Solução longa

Adicione o token Laravel CSRF como constante angular na página principal / layout.

  

Adicione o token como um header padrão para todos os seus pedidos em Angular.

 angular.module("myApp").run(function($http, CSRF_TOKEN){ $http.defaults.headers.common["csrf-token"] = CSRF_TOKEN; }) 

Tenha seu filtro csrf no Laravel para verificar se há uma partida nos headers em vez de uma input.

 /** * Check that our session token matches the CSRF request header token. * * @return json */ Route::filter("csrf", function() { if (Session::token() !== Request::header("csrf-token")) { return Response::json(array( "error" => array( "code" => "403", "message" => "Ah ah ah, you didn't say the magic word.", ), )); } } 

O problema é com o object Request Symfony, que é estendido no framework Laravel. Veja este fio de github

https://github.com/laravel/framework/issues/1655#issuecomment-20595277

A solução no seu caso seria configurar o nome do header para HTTP_CSRF_TOKEN ou HTTP_X_CSRF_TOKEN se você preferir prefixar X para seus headers HTTP personalizados.