Laravel sanctumで401 Unauthorized ユーザー情報が取得できない場合

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:8080127.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

参考にしたサイト

Laravel API SanctumでSPA認証する - Qiita

Getting 401 unauthorized for Laravel sanctum

無制限に質問可能なプログラミングスクール!

万が一転職できない場合は、転職保障全額返金できるコースもあり!!

無制限のメンター質問対応

 

DMMウェブキャンプでプログラミングを学習しませんか?

独学より成長スピードをブーストさせましょう!

 

まずは無料相談から!

おすすめの記事