Laravel ブラウザからログイン済みのユーザーが実行できるAPIの作成と確認

# 概要

- Laravelのアプリケーションにてブラウザからログインしているユーザーが実行できるAPIを作成する方法をまとめる。

# ご注意

- 本知見は同じチームで働くエンジニアさんにご教授いただいた内容です。
    - 筆者がかなり詰まっていたときにお力添えいただきました！改めてお礼申し上げます！
- 今回、詰まりそうな作業を極力少なくするためにAPIで実行されるルーティングをweb.phpに記載します。
    - 本来、APIのルーティングはapi.phpに記載することが望ましいです。
- 今回web.phpで定義している処理はあくまで「ROOT GET OK」の文字列を返すだけのものですが、応用すればいろいろな処理が可能です。

# 作成

1. Laravelの新規アプリケーションを作成する。
1. 下記の方法でLaravel Breezeを用いた認証処理を作成する。
    - [https://readouble.com/laravel/9.x/ja/starter-kits.html](https://readouble.com/laravel/9.x/ja/starter-kits.html)
1. DBにテーブル作成、.envの記載とアプリケーションの起動、composer install、などを行い、ブラウザから「Register」ページにアクセスして任意のユーザーを登録する。

    ![laravel_auth-実行結果-1_png__1242×874_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/b2a3f941-dd65-d8a2-f1f1-3b86774241e1.png)

1. 登録したユーザーでブラウザからログインできる事を確認する。
1. 下記の記載をweb.phpに記載する。

    ```web.php
    Route::get('/get_test', function(){
        return 'ROOT GET OK';
    })->middleware('auth');
    ```

# 体験

### 用意するもの

- PostmanやThunder Clientなどのリクエストを送るツール
    - [VScode Thunder Client の導入方法](https://qiita.com/miriwo/items/5abec919de64c6c90717)
- リクエストを送るツールで下記のようなリクエストを作成

    | 項目 | 情報 |　備考　|
    | --- | --- | --- |
    | リクエスト名 | get_test | 皆さんの任意のものでOK |
    | HTTPメソッド | GET |  |
    | リクエスト送信URL | 任意のホスト名/get_test | dockerの方は`http://localhost:ポート番号/get_test`<br>php artisan serveでローカルサーバー立てている方は`http://127.0.0.1/get_test`とかになるはずです。<br>php artisan serveの方のURLが若干自信無いので間違えているかも。。すみません |
    | ヘッダー情報 | 空 | 一回authミドルウエアが実行されているか知りたいのでまずは空で |
    | Auth情報 | 特に入力しない |  |

### ヘッダー情報が空（未認証）でどんな挙動をするか確認

- `/get_test`に対してGETのリクエストを投げてみる。
- web.phpにAPIのルーティングを記載しちゃっているためおそらくログイン画面のhtmlが返される。
    - これはブラウザ側で認証していないと開けないURL領域に未認証状態でアクセスした場合と同じ挙動。ブラウザで見ているかリクエストを送るツールで返されたhtmlのコードを見ているかの差。
- 認証をパスした状態で「ROOT GET OK」の文字が返って来てほしいので次の方法で確かめてみる。

### ブラウザでログイン、ヘッダーにCookieを追加してどんな挙動をするか確認

1. [作成](#作成)での中で行った作業と同じ様にブラウザからログインを行う。
1. ログインした画面（おそらくダッシュボード画面）にてChromeの開発者ツールを起動する。
1. 「Network」タブをクリックする。

    ![ホーム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/c15471fa-a31c-6f8a-aeef-19c7780e82ce.png)

1. 一度画面をリロードする。
1. 「Name」の部分に「login」や「home」などがあると思うのでクリックする。

    ![ホーム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/b63196d0-ccbd-e418-8f2f-267325c380c8.png)

1. 「Request Headers」の「Cookie」を全選択してコピーする。（`Cookie:`の部分も含めてすべてコピーする。）

    ![ホーム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/692f3d49-7e4f-4a9b-081f-0b843cfc5d1d.png)

1. リクエストを送るツールの当該のリクエストのヘッダーにコピーしたCookieをそのまま貼り付ける。
    - Thunder Clientの場合
        1. リクエストの詳細の「Headers」をクリックする。
        1. 「Raw」のチェックボックスにチェックをつける。
        1. コピーした内容を貼り付け。

            ![get_test_—_line_crm_project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/0e309332-0597-8d72-b289-c021f01a856e.png)
        
        1. ちなみに筆者のThunder Clientは`http://localhost:8000`を変数「host」に割り当てている。

            ![Environment_Variables_—_line_crm_project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/5c904134-50fc-ecb7-9670-e38c910a4ec0.png)


    - Postmanの場合（今回は未検証、昔に試した方法を思い出して記載しているので若干違うかも、すみません。）
        1. リクエストの詳細の「Cookies」をクリックする。

            ![Postman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/a99c60f4-b3da-89d3-dff3-bea8ab25c4d8.png)

        1. 任意のドメイン名（おそらく）を入力して「Add」をクリックする。

            ![Postman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/acb8ee3a-91bc-1614-a1e2-39e39c342965.png)

        1. 「Add Cookie」をクリックする。

            ![Postman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/67fe7b71-679c-2b46-3726-d3920b314a12.png)

        1. コピーした内容を貼り付けて「Save」をクリックする。

            ![Postman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/315c14d4-cf5e-be59-228d-0c3cb6c06314.png)

1. `/get_test`に向けてリクエストを送信する。
1. ブラウザから認証を突破したCookieをそのままヘッダーに入れてリクエストを投げているので、認証を突破し、「ROOT GET OK」の値が帰ってきた。

    ![get_test_—_line_crm_project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/f5c14a1f-0958-4f38-3975-8e29deff4be2.png)

# 上記を実施しても「ROOT GET OK」の値が帰ってこない場合

1. [作成](#作成)での中で行った作業と同じ様にブラウザからログインを行う。
1. ログインした画面（おそらくダッシュボード画面）にてChromeの開発者ツールを起動する。
1. 「Network」タブをクリックする。

    ![ホーム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/c15471fa-a31c-6f8a-aeef-19c7780e82ce.png)

1. 一度画面をリロードする。
1. 「Name」の部分に「login」や「home」などがあると思うのでクリックする。

    ![ホーム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/b63196d0-ccbd-e418-8f2f-267325c380c8.png)

1. 「Request Headers」に記載されている内容をキーと値すべて範囲選択してコピーする。

    ![ホーム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/cdb1ab5b-109c-f584-3f05-1fb9bc518a55.png)

1. リクエストを送るツールの当該のリクエストのヘッダーにコピーしたRequestHeadersをそのまま貼り付ける。
    - Thunder Clientの場合
        1. リクエストの詳細の「Headers」をクリックする。
        1. 「Raw」のチェックボックスにチェックをつける。
        1. コピーした内容を貼り付け。

            ![get_test_—_line_crm_project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/3d868145-276c-b900-fa3a-ff7fa6d7356d.png)



# ポイント

- Cookieの値はすべてまるまるリクエストで投げてあげること。
    - XSRF-TOKENのセッションIDだけとかを「Cookie」の名前で送信してもだめ！
    - とにかくログインしたあとの画面のリクエストヘッダーのCookieの「Cookie:」も全て含めてコピーしてリクエストを送るツールで送ってあげないと認証されているとアプリ側が認識してくれない。