はかせのラボ

私の頭の中を書いていく雑記ブログです

AWS Cognitoでのサインアップ

あいさつ

どうも、はかせです。
今回はようやっとCognitoでサインアップに成功したので
そのまとめです。

今回使用したunityのバージョンはUnity 2018.3.6f1です。

Unityでやること

Unityでやることは
AWS使うための前準備
・コーディング&オブジェクト配置

この二つです。

AWS使うための前準備

まずは前準備として、
AWSを使うためのdllやらなんやらを入手します。
私は下記の5つを入れました。
NuGet Gallery | AWSSDK.Core 3.3.103.29
NuGet Gallery | AWSSDK.CognitoIdentity 3.3.100.65
NuGet Gallery | AWSSDK.SecurityToken 3.3.102.14
NuGet Gallery | AWSSDK.CognitoIdentityProvider 3.3.102.50
NuGet Gallery | AWSSDK.Extensions.CognitoAuthentication 0.9.4

それぞれページに飛ぶと右側に「Download package」ってのがあるので
そこをクリックしてダウンロードします。
f:id:hakase0274:20190818215141p:plain

ダウンロードしたら拡張子が「.nugkg」になっていると思います。
f:id:hakase0274:20190818215430p:plain
この部分をまるっと「.zip」にしましょう
データの欠損とかは発生しないので安心してください。
名前を変えたら解凍してください。

そしたらおそらくこんな感じのフォルダ構造になっているはずです。
f:id:hakase0274:20190818215534p:plain

今回使うのはlib配下のnet45というフォルダです。
f:id:hakase0274:20190818215655p:plain
これをそのままUnity内に放り込んじゃってください

この作業をダウンロードしたもの全てで行ってください。
そうしたらUnityの中身はこんな感じになっているはずです。
f:id:hakase0274:20190818215915p:plain
(AWS_Packagesはフォルダが取っ散らかるのが嫌だったんで作っただけです)

前準備もあと少しで終わります。
次に放り込んだdllを使えるようにUnityの設定を弄ります。
Unityの左上らへんにあるメニューの
Edit > Project Settings > Player > Other Settingsの中にある
Api Compatibility Levelを.NET 4.xに変更してください
f:id:hakase0274:20190818220745p:plain

コーディング&オブジェクト配置

いよいよUnityでのコーディング&オブジェクト配置です。
まずはオブジェクトを置いてしまいましょう。
今回必要なものは
・サインアップ用のEmailとPasswordの入力フォーム
・サインアップボタン
・入力したEmailに送られてきた認証コードの入力フォーム&送信ボタン

まぁこんな感じです。
f:id:hakase0274:20190818221959p:plain

次にコードです。
まずはサインアップボタンを押したときの処理です。

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Amazon.CognitoIdentityProvider; // for AmazonCognitoIdentityProviderClient
using Amazon.CognitoIdentityProvider.Model; // for SignUpRequest
using MySpace;

public class Signup : MonoBehaviour
{
    public InputField emailField;
    public InputField passwordField;

    public void OnClick()
    {
        var client = new AmazonCognitoIdentityProviderClient(null, Amazon.RegionEndpoint.APNortheast1);
        var sr = new SignUpRequest
        {
            ClientId = AWSIDs.ClientID,
            Username = emailField.text,
            Password = passwordField.text,
            UserAttributes = new List<AttributeType>
            {
                new AttributeType
                {
                    Name = "email",
                    Value = emailField.text
                }
            }
        };

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

内容自体は落としてきたdllの中にあるクラスを作って
手順通りにリクエストを送っているだけです。

ここで使っているAWSIDsというのは自作クラスで
こんな感じです。

namespace MySpace
{
    public static class AWSIDs
    {
        public static string ClientID = "自分のクライアントID";
        public static string UserPoolID = "自分のUserPoolID";
    }
}

まぁマジックナンバーは少しでも減らしましょうってことで。

こうして作ったコードをサインアップボタンにあてがって
OnClick()をボタンコンポーネントのOnClickに登録しましょう

そして次は認証コード送信ボタン

using System;
using UnityEngine;
using UnityEngine.UI;
using Amazon.CognitoIdentityProvider;
using Amazon.CognitoIdentityProvider.Model;
using MySpace;

public class Confirmation : MonoBehaviour
{
    public InputField emailField;
    public InputField confirmationCodeField;

    public void OnClick()
    {
        var client = new AmazonCognitoIdentityProviderClient(null, Amazon.RegionEndpoint.APNortheast1);
        var confirmSignUpRequest = new ConfirmSignUpRequest
        {
            Username = emailField.text,
            ConfirmationCode = confirmationCodeField.text,
            ClientId = AWSIDs.ClientID
        };

        try
        {
            var confirmSignUpResult = client.ConfirmSignUp(confirmSignUpRequest);
            Debug.Log(confirmSignUpResult.ToString());
        }
        catch (Exception ex)
        {
            Debug.LogError(ex);
        }
    }
}

やってることはさっきとほとんど同じです。
こっちも同様にボタンにつけて登録しましょう。

これでUnityでやることは終わりです。

AWSでやること

AWSでやることは
・UserPoolの設定
・IDPoolの設定

この二つです。

UserPoolの設定

Congnitoで認証するアプリやユーザーの設定をします。
基本的には公式とか先人たちの記事に従って作ればいいのですが、
注意点が一つあります。
おそらく順当に作ってIDとか取得して先述のコードに値放り込んでやると
こんなエラーに遭遇すると思います。

NotAuthorizedException:Unable to verify secret hash for client XXX

(XXXがクライアントID)

これはちょっとIDを作るときの設定を弄ることで解決します。
f:id:hakase0274:20190818223723p:plain
このクライアントシークレットっていう設定が邪魔らしいです。
なのでクリックして設定を外しましょう。

ちなみに散々言ってるクライアントIDってのはこれです。
f:id:hakase0274:20190818223920p:plain
(アプリクライアントタグから確認できます)

IDPoolの設定

IDPoolってのは認証時と非認証時での
アクセス権限の設定とかできるらしいです。
今回はサインアップだけだったので
特に弄らず公式や先人たちの記事を参考に作りました。

実行

時は満ちた・・・・
というわけで諸々の値を設定して
実行ポチっとな。
f:id:hakase0274:20190818224353p:plain

無事ユーザーが追加されました。

あとがき

今回はAWSCognitoを使ってサインアップをやってみました。
ただサインアップするだけでこの手間がかかるとは・・・・
私が慣れてないってのが大きな要因でしょうが
極めて時間がかかりました。

最初はUnityで配布されているAWSSDK使ってたんですが、
公式や先人たちのやり方に倣ってやってもうんともすんとも言わない。

諦めて.NETの方で配布されているAWSSDKを使ってやりました。
(こっちのが割と慣れた書き方や使い方だったりする)

それでは今回はこの辺でノシ