PostmanでLaravel Sanctumを使う手順

Larvel 7.xには「Laravel Sanctum」というSPAやモバイルアプリケーション向けの認証システムが用意されています。簡単にログイン・ログアウトができて大変便利なのですが、Postmanを使う際に色々と設定が必要だったので、ここに残しておきます。

# とはいえ、海外のチュートリアルをそのまま日本語テキストにしただけなんですけどね...

英語のチュートリアル動画はこちら
https://codecourse.com/watch/laravel-sanctum-airlock-with-postman?part=laravel-sanctum-airlock-with-postman

それでは、やっていきましょう。

# 0. 事前情報
Dockerにて下記のイメージを使用しました。

- nginx:latest
- bitnami/php-fpm:latest
- mariadb:latest

今回とは特に関係がありませんが、この環境でも問題なく動いたよという報告も兼ねて記載しておきます。

また、FiddleのHOSTを使って `localhost:1000  qiita-sanctum` として登録しています。 `http://qiita-sanctum/` を叩けば、Laravelのトップページが表示されるようになっています。

以上が今回の環境です。

---

# 読む前に...下記の手順について追記
Collectionに「Pre-request Script」としてCSRFトークンを取得・セットする記述を行いましたが、login用のリクエストタブ内の「Pre-request Script」に追加するだけで十分なようです。

Collectionに設定してしまうと、他のリクエストを行う際も毎度まいどCSRFトークン発行をリクエストしてしまうので、余計な１リクエスト分を節約するためにも避けた方が良いかもしれません。（詳しいことは検証していないので、各自判断してください。）

---

# 1.environmentを作成する

![c8438fa156129f157a6c7b7ca2a92ec2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35783/42517a9a-841f-7e7d-25bb-a5bf23f1d750.png)

1. 目マークをクリックする。
2. 「Add」をクリックする。

![aa9bafc413c901cfd8f14a2eeadf4f36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35783/7e970ff0-7b8c-ee28-ed98-59e5ec1d37b3.png)

1. 適当にenvironmentの名前を付ける。（今回は「qiitaの環境」としました。）
2. 「Add」で追加をする。
3. Xボタンからモーダルを閉じる。

![13acd1a6aa81d135ae8e578450df47ff.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35783/61209f95-6b67-106f-81d2-a854139aea82.png)

右上の欄から先程作成したenvironmentを選択する。（「qiitaの環境」を選択しました。）

# 2.Collectionを作成する

![8bf8c0520564ff0c083ea6dd6b6c708c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35783/fc3a5916-3e35-b84a-26da-0bd9870c90f4.png)

1. 「New Collection」をクリックする。
2. 適当な名前を入力する。
3. 「Create」でCollectionを作成する。

# 3.リクエストを諸々設定していく

リスエストを設定していく前に、リクエストをコレクションに保存しておく必要があります。

![4897c36a29696df5259c093d4ee3bf93.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35783/51bda096-2e7b-ed70-a6d6-7f433165e775.png)
![4404bc38f325843c2b68b55dcadf539f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35783/20fbde58-976c-b3b5-a9d4-22a728ecb484.png)


1. ▼マークをクリックする。
2. Save Asをクリックする。
3. 先程作成した「Collection」を選択する。
4. 「Save」をクリックする。

以上でコレクションへの保存は完了です。
次にリクエストを設定していきましょう。

![0208444f4251c92007bd78cd7ec5a520.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35783/65c2ab1f-fc36-52d2-cc1a-bbbd78619c3d.png)

1. POSTを選択する。
2. LaravelのURL + `/login` を入力する。（今回の環境では「qiita-sanctum/login」としました。）

![14d9a3aa0df7ad76f37c3e710e6f686b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35783/bbed2f40-f4d7-5224-60a3-dbbb072599c3.png)

事前に作っておいたログイン用のアカウント情報を入力する。KEYには「email」と「password」と入力し、それぞれに沿った情報を入力する。

この状態で一旦、「Send」からリクエストを実行してみます。

![9face4e321846c900e0f00ea17abf29d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35783/23035a3b-35df-a4cf-ccab-ac34c3edf815.png)

エラーコード「419」が返ってきました。
これはCSRFトークンが添えられていないために起きる問題です。
Laravel Sanctumではログインを行う前にCSRFトークンを発行しておく必要があります。次の手順に進んでトークンを発行し、headerに含む設定を行います。

# 4.CSRFトークンを発行して適用する

![f3be37292cc13a6b2a876e2964718861.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35783/fe565d06-5f83-01b6-8944-275278846b5e.png)

1. 先程作成したCollectionにカーソルを合わせて、三点リーダーのアイコンをクリックする。
2. 「Edit」をクリックする。

![2d7f06c6c6dc668a56228b924c747591.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35783/f4b62b05-fb6d-1ca0-062f-8247476ee53c.png)

1. 「Pre-request Scripts」タブを選択する。
2.  CSRFトークン取得・セットのスクリプトを記述する。
3. 「Update」をクリックする。

（2）の記述は下記の通りです。

```
pm.sendRequest({
    url: 'http://qiita-sanctum/sanctum/csrf-cookie',
    method: 'GET'
}, function (error, response, { cookies }) {
    if (!error) {
        pm.environment.set('xsrf-token', cookies.get('XSRF-TOKEN'))
    }
})
```

Pre-request Scriptは、リクエストタブで指定したURLへのリクエストよりも先にリクエストを実行します。事前にCSRFトークンを発行し、Postmanのenvironmentにこのトークンをセットする...という処理です。（コードは動画からパクりましたｗ）

ここで一旦、「Send」でリクエストを実行してみましょう。

![6120b8c51cb05863d8386b908a46545d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35783/86785b38-fb61-94ec-c232-c11792b2e2bc.png)

1. 目マークをクリックする。
2. 「xsrf-token」という名前でCSRFトークンがセットされていることを確認する。

CSRFトークンがセットできましたので、トークンを適用していきましょう。

![63bef8a234108502a3c1bfad073ba888.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35783/a19977fc-87f8-3c8a-7681-bd0687edd614.png)

1. Headersタブを開く。
2. それぞれの項目を入力する。

(2)では、下記の情報を入力しました。

```
Accept: application/json
X-XSRF-TOKEN: {{xsrf-token}}
```

{{xsrf-token}} と入力してマウスカーソルを当てると、トークンの内容が表示されるはずです。ここで表示されない場合は、何らかの手順が抜けている可能性があります。

# 5.ログインを実行する

では、ログインを実行するために「Send」をクリックしましょう。
Bodyに何も表示されなければ、もう一度実行してみましょう。

![f3c11c07b1dcc9ea96b19646cd87a2a3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35783/b1d71d16-7481-726d-ef1f-976061e412e3.png)

Bodyの75行目あたりに「You are logged in!」と表示されれば、ログイン成功となります！

---

# 番外編： api/user を叩くには
api/userをPostmanで叩くためには、ここでもいくつか作業が必要となります。

![25bc6f6f425cbbb23a56a042652b55c0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35783/c42d573f-b446-27fe-0115-0aa2dcde70ab.png)

単純に「qiita-sanctum/api/user」に対してHeader「Accept: application/json」だけを設定してリクエストを送っても正しく動きません。

![2b84ba4e61395b35dd55518540f925b1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35783/707fbfb6-50ed-a37b-6b85-1749deefda1a.png)

Headersにて「Referer」というKEYを追加し、「localhost」というVALUEを設定する必要があります。

このように設定を行うと、ログイン中のユーザー情報を取得することができます。

お疲れ様でした。