Laravel8の認証をUnityで使えるか

# Laravel8の認証をUnityで使えるか（読み出しのみ）

## やりたいこと
Unityでデスクトップアプリを作りたいんだけど、認証は既存のLaravelを使いたい。

## 前提条件
- Laravel8
- Jetstream導入済み
- Unityは2020のLTS（WebRequest使用のため）

以下は全てDockerで実施しています。

## 最初に迷ったこと
LaravelにAPIって言れようと検索するとSanctumを入れなさいとでてくるので、composerで入れようとしました。で、**php artisan**やっても"**Nothing to migrate.**"と出てきました。

いつのまにか寝ぼけてインストールしたのかと思ったんですが、どうやた**JetstreamにはSacntumが導入**されているようです。

## 認証どっち？
Sanctumには2種類の認証があるらしい

- APIトークン
- SPA認証

今回はAPIトークン認証にしてみました。

## Laravel側の流れ

### LaravelのAPI認証を有効にする
Jetstream導入済みのLaravelでAPI認証を有効にするには、**config/jetstream.php**の Features::api()のコメントを外します。（デフォルトはコメントアウトだったと思います）

```
    'features' => [
        // Features::termsAndPrivacyPolicy(),
        // Features::profilePhotos(),
        // Features::api(),
        Features::teams(['invitations' => true]),
        Features::accountDeletion(),
    ],
```

を

```
    'features' => [
        // Features::termsAndPrivacyPolicy(),
        // Features::profilePhotos(),
        Features::api(),//<--コメントアウト外す
        Features::teams(['invitations' => true]),
        Features::accountDeletion(),
    ],
```

#### 参考サイト
https://readouble.com/jetstream/1.0/ja/api.html

App/ProvidersのJetstreamServiceProviderのパーミッション設定はすでにあるかと思いますので、今回は設定しませんでした。

### トークンを発行する
この時点ですでにトークンが発行できるようですので、プロフィールページからAPIトークンを作成し、APIトークンの作成からトークンを作成できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221026/3ba664b2-85ff-a84c-55d0-16446da79a9b.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221026/17a8d003-c542-fdb9-0419-2bd751adc4f0.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221026/39eb86ba-e85c-eb92-1e61-a7c139119c29.png)


## APIが動作するか確認をする
Unityでのコーディングに入る前にAPIが動作するか確認をしたいのですが、いちいちコーディングするのも大変だなぁと思っていたらPosmanという面白そうなツールがありました。
https://www.postman.com/

デスクトップ版をダウンロードし、SignUpします。
チュートリアルを終了し、GETでURLはLaaravelのローカルアドレスにします。TypeはBearer Tokenとします。ここではuserデータを取得するものにしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221026/e4898702-6ab6-69df-c08c-28dae0b81f29.png)

Sendを押すと、JSON形式でuserデータが無事取得できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221026/0f23f1a8-7722-0059-bf24-ef1cb860a521.png)


## Unity側のスクリプト

以下で取得できます。

```csharp:networkConnection.cs
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

//後で個別に取り出す用
[System.Serializable]
public class Player
{
    public string name;
    public int current_team_id;
}


public class networkConnection : MonoBehaviour
{

    private string accessToken = "TOKEN HERE";//ここにトークンを入れます

    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(APIExample());
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    IEnumerator APIExample()
    {

        string url = "http://localhost:8000/api/user";//APIアクセス先URL

        using (UnityWebRequest request = UnityWebRequest.Get (url)) {//GETで取得します

            request.SetRequestHeader("Authorization","Bearer " + accessToken);
//Bearerのrの後の半角スペース必要

            yield return request.Send ();

            switch (request.result)
                        {
                            case UnityWebRequest.Result.ConnectionError:
                            Debug.Log("サーバとの通信に失敗");
                            break;
                            case UnityWebRequest.Result.DataProcessingError:
                                Debug.LogError("データの処理中にエラー ");
                                break;
                            case UnityWebRequest.Result.ProtocolError:
                                Debug.LogError("HTTPのエラー");
                                break;
                            case UnityWebRequest.Result.Success:
                                Debug.Log("成功：取得結果は→" + request.downloadHandler.text);

                                //JSONをオブジェクトにする
                                string jsonstr = request.downloadHandler.text;
                                Player player2 = JsonUtility.FromJson<Player> (jsonstr);
                                Debug.Log (player2.name);//ユーザ名
                                Debug.Log (player2.current_team_id);//チームID
                                break;
                        }

                    };

                }

}

```

スクリプトの参考サイトは以下のとおりです
https://gomafrontier.com/unity/2475#Unity