web-dev-qa-db-ja.com

Laravel X-CSRF-TokenがPOSTMANと一致しません

REST Laravelで構築されたAPIと通信しようとします。しかし、トークンの不一致により、POSTMANでの呼び出しは拒否されます。CSRFトークンをヘッダーに含める必要があると思います。しかし、暗号化されたトークンが必要ですか?このトークンを挿入しても、トークンの不一致があるというエラーが表示されます。

私は使用してトークンを取得します:

$encrypter = app('Illuminate\Encryption\Encrypter');
$encrypted_token = $encrypter->encrypt(csrf_token());
return $encrypted_token;

しかし、これは更新のたびに変わるはずですか?

13
sesc360

フォームを使用していない場合-たとえばAPIの場合-ここにある手順に従うことができます https://Gist.github.com/ethanstenis/3cc78c1d097680ac7ef

基本的に、以下をブレードまたはtwigヘッダーに追加します

_<meta name="csrf-token" content="{{ csrf_token() }}">
_

Postman Interceptorがインストールされていない場合はインストールし、オンにします

次に、ブラウザーでサイトにログインし(認証を受ける必要があります)、要素を検査するかソースを表示してトークンを取得します

Postmanで、必要に応じてGET/POSTなどを設定し、ヘッダーで新しいペアを作成します

_X-CSRF-TOKEN        tokenvaluetobeinserted235kwgeiOIulgsk
_

APIをテストするときにCSRFトークンをオフにすることを推奨する人もいますが、実際にテストしているのはあなたではありません。

まだエラーがある場合は、Laravelがエラーメッセージでかなり明示的である傾向があるため、previewを使用して応答を確認してください。何も戻らない場合は、_php_error.log_(それが何と呼ばれていても)を確認してください。


ps 2018年10月-APIの登録、ログイン、ユーザートークンを処理するためにLaravel Passportを使用します-一見の価値があります!

14
brianlmerritt

はい、更新ごとに変更されます。あなたはそれをビューに入れて、投稿するときに「_token」の値として送信する必要がありますPOST var。

標準のPOSTを使用している場合は、これをフォームに追加するだけです。

<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">

AJAXを使用している場合は、_tokenの値を取得し、リクエストでそれを渡してください。

REF: http://laravel.com/docs/5.1/routing#csrf-protection

4
James Taylor

Postmanを使用する
次のようなページにGETリクエストを行います
<meta name="csrf-token" content="{{ csrf_token() }}">
応答から値をコピーします。

ヘッダーフィールドをPOSTリクエストに追加します。

"X-CSRF-TOKEN: "copied_token_in_previous_get_response"
3
Katsum0to

Postman環境でbaseURL変数を使用しているときにこのエラーが発生しました。最後に/apiなしでサイトのURLを呼び出していたことがわかりました。馬鹿げているように聞こえますが、ユーザーエラーを排除するために、リクエストURLが以下に基づいていることを確認してください。

https://<your-site-url>/api

ない:

https://<your-site-url>

0
James Cushing