TL;DR
HTTPリクエストのヘッダに、 Accept: text/json
が抜けている可能性が高い。
Laravelのレスポンスが login になる場合。
api で auth を入れているところへリクエスト投げつける。
HTMLのログインが帰ってくる。
実例
curl -H 'Content-Type: application/json' -F file='@/Users/takuya/Pictures/Dh6PcyQUYAEzhKp.jpg' http://127.0.0.1:8000/api/user/1/images/ * Connected to 127.0.0.1 (127.0.0.1) port 8000 (#0) > POST /api/user/1/images/ HTTP/1.1 > Host: 127.0.0.1:8000 > Accept: */* > Accept-Encoding: gzip, deflate, sdch > User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36 > X-Config-File: ~/.curlrc > Content-Length: 37112 > Content-Type: application/json; boundary=------------------------f7fa3a50954906f3 > Expect: 100-continue > * Done waiting for 100-continue 0 37112 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0} [37112 bytes data] * We are completely uploaded and fine < HTTP/1.1 302 Found < Host: 127.0.0.1:8000 < Date: Tue, 28 May 2019 14:57:15 +0000 < Connection: close < X-Powered-By: PHP/7.3.4 < Cache-Control: no-cache, private < Date: Tue, 28 May 2019 14:57:15 GMT < Location: http://127.0.0.1:8000/login < X-RateLimit-Limit: 60 < X-RateLimit-Remaining: 59 < Content-Type: text/html; charset=UTF-8 < { [352 bytes data] 100 37464 0 352 100 37112 272 28724 0:00:01 0:00:01 --:--:-- 28996 * Closing connection 0 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <meta http-equiv="refresh" content="0;url=http://127.0.0.1:8000/login" /> <title>Redirecting to http://127.0.0.1:8000/login</title> </head> <body> Redirecting to <a href="http://127.0.0.1:8000/login">http://127.0.0.1:8000/login</a>.
同一ページに Accept-JSONを併せて送りつけた場合。
HTTPのヘッダにAcceptを入れると、401 がとJSONが返ってくる。
takuya@$ curl-json -H 'Content-Type: application/json' -F file='@/Users/takuya/Pictures/Dh6PcyQUYAEzhKp.jpg' http://127.0.0.1:8000/api/user/1/images/ > POST /api/user/1/images/ HTTP/1.1 > Host: 127.0.0.1:8000 > User-Agent: curl/7.65.0-DEV > Accept: text/json > X-Config-File: ~/.curlrc-json > Content-Length: 37112 > Content-Type: text/json; boundary=------------------------4610ff915435cd7f > Expect: 100-continue > * Done waiting for 100-continue } [37112 bytes data] * We are completely uploaded and fine < HTTP/1.1 401 Unauthorized < Host: 127.0.0.1:8000 < Date: Tue, 28 May 2019 14:54:59 +0000 < Connection: close < X-Powered-By: PHP/7.3.4 < Cache-Control: no-cache, private < Date: Tue, 28 May 2019 14:54:59 GMT < Content-Type: application/json < X-RateLimit-Limit: 60 < X-RateLimit-Remaining: 58 < { [30 bytes data] * Closing connection 0 {"message":"Unauthenticated."}
laravel のAPIにリクエストを送付するときは
リクエストヘッダのAccept(クライアントが受け取りたいMIME形式の指定)でJSONを指定する必要がある。
Accept: text/json
これは、どこで定義されているのか
Accept をみてMIMEや認証は、どこのメソッドで定義されているのか。
vendor/laravel/framework/src/Illuminate/Http/Concerns/InteractsWithContentTypes.php#expectsJson
<?php public function expectsJson() { return ($this->ajax() && ! $this->pjax() && $this->acceptsAnyContentType()) || $this->wantsJson(); }
ここでリクエストのヘッダを見ている。HTTP/Requestで使える。