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(),
],
参考サイト
App/ProvidersのJetstreamServiceProviderのパーミッション設定はすでにあるかと思いますので、今回は設定しませんでした。
トークンを発行する
この時点ですでにトークンが発行できるようですので、プロフィールページからAPIトークンを作成し、APIトークンの作成からトークンを作成できます。
APIが動作するか確認をする
Unityでのコーディングに入る前にAPIが動作するか確認をしたいのですが、いちいちコーディングするのも大変だなぁと思っていたらPosmanという面白そうなツールがありました。
https://www.postman.com/
デスクトップ版をダウンロードし、SignUpします。
チュートリアルを終了し、GETでURLはLaaravelのローカルアドレスにします。TypeはBearer Tokenとします。ここではuserデータを取得するものにしています。
Sendを押すと、JSON形式でuserデータが無事取得できました。
Unity側のスクリプト
以下で取得できます。
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