HAMADAの語り草

興味のある技術のアウトプットをしたいと思います

UnityとAWS Cognitoでサインアップしてみた話

はじめに

こんにちは、会津大学学部二年のHAMADAです。もう今年も残り11ヶ月ということで恐ろしさを感じている今日この頃です。 今年は、毎月技術ブログを2本書きたいと思っているので、来月も頑張ります。 さて今回はUnityとAWS Cognitoのサインアップの話です。

目的と動機

AWSを触る機会が多いですが、A-PxLの活動には今のところ活かせていないので、何かできないかなと思いながら取り組んでみました。サインイン等はうまく活かせば、オンラインゲームやXRのアプリケーションに使えそうなのでCognitoを使います。

使用技術

  • Unity 2022.1.0.f1

    最近触っていなかったので、ただでさえ出来ないのによりひどくなっていました…

  • AWS

    Azureや GCPも触ってみたい気持ちがあります。今回は以下のものを使いました。

    • AWS Cognito

      サインアップ、サインイン等ができるもの。つまりユーザごとの管理ができる(他のAWSサービスとの連携) サードパーティのサインインの使用もできる。

    • (AWS CDK)

      前回のブログの環境を流用しました。一部CognitoをCDKから作成したもののコードのみ記載します。

やったこと

  • Unityでプロジェクトを作成し、nugetからパッケージをダウンロードしてインポート
  • ボタン等を作成
  • コードの作成
  • 実行してみる。

Unityプロジェクトのセッティング

nugetからパッケージをダウンロードしてインポート

ここ(https://www.nuget.org)から以下のパッケージのインポートする

  • AWSSDK.Core
  • AWSSDK.CognitoIdentity
  • AWSSDK.SecurityToken
  • AWSSDK.CognitoIdentityProvider
  • AWSSDK.Extension.CognitoAuthentication

拡張子を.nupkgから.zipに置き換えたのち、zipを解凍します。

その中のlib以下にあるnet45をそのままUnityに入れます。

この時、UnityにはAssetの下にPluginsフォルダを作成し、その中に入れます。

導入するパッケージには依存関係があるので、一つずつ入れていくときにerrorが出ますが、全て入れると解決できます。

怖い話ですが、errorが消えない場合でもUnityを再起動したら、errorが消えたのでうまくいかない場合は試してみてください。

ボタン等の作成

こんな感じになるようにButtonとInputFieldを作成します。

今回はTextMeshProを使っています。

コードを作成

CDKでUserPoolを作成

先にCDKでUserPoolを作成するコードを紹介します。

userPool := awscognito.NewUserPool(stack, jsii.String("UserPool"), &awscognito.UserPoolProps{
        UserPoolName:      jsii.String("userpool"),
        SelfSignUpEnabled: jsii.Bool(true),
    })

awscognito.NewUserPoolClient(stack, jsii.String("sample-client"), &awscognito.UserPoolClientProps{
        UserPoolClientName: jsii.String("app-client"),
        UserPool:           userPool,
    })

前回のブログのコードに上記のように追記することで、今回必要な環境が構築できます。

CDK側からするとemail等がなくても登録できるように設定できます。

SelfSignUpEnabledをTrueにすることで今回やりたいことがうまくいきます。

また、アプリケーションクライアントもCDK側から作成しています。

Signupするためのコード

using System;
using System.Collections.Generic;
using UnityEngine;
using Amazon.CognitoIdentityProvider;
using Amazon.CognitoIdentityProvider.Model;
using TMPro;

public class Signup : MonoBehaviour
{
    public TMP_InputField clientidField;
    public TMP_InputField usernameField;
    public TMP_InputField passwordField;

    public void OnClick()
    {
        var client = new AmazonCognitoIdentityProviderClient(null, Amazon.RegionEndpoint.APNortheast1);
        var signup_request = new SignUpRequest 
        {
            ClientId = clientidField.text,
            Username = usernameField.text,
            Password = passwordField.text,
        };

        try
        {
            var result = client.SignUp(signup_request);
            Debug.Log(result);
        }
        catch (Exception ex)
        {
            Debug.LogError(ex);
        }
    }

}

AmazonCognitoIdentityProviderClient で新しくクライアントを作成します。

SignUpRequest でサインアップの登録用の情報を入れます。ここではemailなどの属性を指定することもできます。

client.SignUpで実際に登録します。

このコードをButtonに付けて、それぞれのInputFieldにUIのInputFieldを登録していきます。

Buttonのinspectorにある、On Click()にButtonを登録。Fuctionには、Signup.OnClickを設定します。

実行してみる

Unityで再生ボタンを押して実行します。

clientIDには、アプリケーションクライアントのIDをいれ、usernameには適当な名前を、passwordも自分で設定して入力します。その後SignUpボタンを押すと作成できます!

こんな感じに作られます。

感想と展望

AWS Cognitoの最もシンプルな使い方であろう方法をUnityで試してみました。Cognito自体よりもUnityや.NETのパッケージのセッティングで今回は苦しんだのかなと思います。EmailやSMSの認証を設定していないのでセキュリティの問題は大きくありますが、簡単に実験的にやる分にはシンプルでいいのかなと思います。実運用向きでは絶対ないです。Unityに久しぶりに触れられたので収穫としては満足です!ここまでお付き合いいただきありがとうございます!何かの参考になれば幸いです!

所属サークル

A-PxL (@aizu_PxL) / X

私のTwitter

HAMADA (@AHMOS_HMD) / X

私のgithub

ahmos0 (HAMADA) · GitHub

参考リンク

hakase0274.hatenablog.com