
sanctum認証でユーザー情報が取得できず401 Unauthorizedのエラーが出た場合の解決方法。
- ログインには成功するのに、ユーザー情報が取得できない
- 本番環境やローカル同一ネットワーク内の別PCからだとsanctumのログイン処理後、ユーザー情報が取得できない
などなど。
原因としては、sanctum.phpにアプリのドメインやポート番号を登録していない可能性がある。
//api.php
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user();
});
このapiを呼ぶと
GET http://192.168.47.22/api/user 401 (Unauthorized)
や
GET http://localhost:8080/api/user 401 (Unauthorized)
などの認証エラーが出る場合。
処理を行うドメインやIPアドレスを設定ファイルに追加しないといけない。
初期値だと、localhostや127.0.0.1しか登録されていない。
初期値
//sanctum.php
/*
|--------------------------------------------------------------------------
| Stateful Domains
|--------------------------------------------------------------------------
|
| Requests from the following domains / hosts will receive stateful API
| authentication cookies. Typically, these should include your local
| and production domains which access your API via a frontend SPA.
|
*/
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
'%s%s',
'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1',
env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : ''
))),
ポート番号が80か443以外の環境の場合
例えば開発環境が8080番なら、
localhost:8080
と127.0.0.1:8080
を追加する
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
'%s%s',
'localhost,localhost:3000,localhost:8080,127.0.0.1,127.0.0.1:8000,127.0.0.1:8080,::1',
env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : ''
))),
'localhost,localhost:3000,localhost:8080,127.0.0.1,127.0.0.1:8000,127.0.0.1:8080**,**::1',
の最後のほう**,**::1'
の,
忘れないように注意。
動作確認時には、リロードしないとなんかうまく反映されなかった。
実機をサーバーにしているときの例
実機のIPアドレスを追加する(ポートが80か443以外ならポート番号も含めて書く)
//プロジェクトディレクトリ\config\sanctum.php
/*
|--------------------------------------------------------------------------
| Stateful Domains
|--------------------------------------------------------------------------
|
| Requests from the following domains / hosts will receive stateful API
| authentication cookies. Typically, these should include your local
| and production domains which access your API via a frontend SPA.
|
*/
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
'%s%s',
'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,192.168.47.22,::1',
env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : ''
))),
//実機をサーバーにしているのでローカル開発環境でも使えるようにするために192.168.47.22,を追加
'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,192.168.47.22**,**::1',
の最後のほう**,**::1'
の,
忘れないように注意
本番環境なら、ドメインを登録するイメージやな
こちらも動作確認時には、リロードしないとなんかうまく反映されなかった。
疑問点
ポート番号:80を含めて書くとどうなるの?
→動作しなかった。http(80番)やhttps(443)の時はポート番号をsanctum.php
に記載する必要はない。
設定後、ブラウザでリロードは必要か
→必要っぽい。sanctum.php
を更新しただけではログインできなかった。
公式にそんなこと書いてるか???
書いてた
ファーストパーティドメインの設定
最初に、どのドメインから皆さんのSPAがリクエストを作成するのか設定する必要があります。sanctum設定ファイルのstateful設定オプションを利用してこのドメインを指定します。この設定を元にして皆さんのAPIへリクエストを作成するときに、Laravelのセッションクッキーを使用することで「ステートフル」な認証を維持する必要があるドメインを判断します。
Note: ポート(127.0.0.1:8000)を含むURLによりアプリケーションにアクセスする場合は、ドメインにポート番号を含める必要があります。
https://readouble.com/laravel/7.x/ja/sanctum.html
sanctum.php
を編集するんだよ!って書いてくれよw
参考にしたサイト