怠慢プログラマーの備忘録

怠慢でナマケモノなプログラマーの備忘録です。

【iOS】AWS Amplify Authで認証後にidとemailを取得するのが面倒な件

AWS側の設定は省略します。SDK側の話です。

最初のサインイン部分は公式通りです。

docs.amplify.aws

func socialSignInWithWebUI() {
    Amplify.Auth.signInWithWebUI(for: .facebook, presentationAnchor: self.view.window!) { result in
        switch result {
        case .success:
            print("Sign in succeeded")
        case .failure(let error):
            print("Sign in failed \(error)")
        }
    }
}

ここまででクライアント側はSocialSignInが完了します。
認証完了後にuserIDとemailを取得したい、みたいなシーンはよくあるかと思いますが、割と一筋縄ではいかないポイントです。

Amplify.Auth.getCurrentUser()

Firebase Authenticationを使ったことある方はまずこれを思い浮かぶかと思います。

しかしgetCurrentUser()にはuserIdプロパティはありますが、emailプロパティはありません。
さらにuserIdプロパティは必ずnilで返却されてきます。おそろしい。

UserAttributes

Amazon CognitoのユーザープールにアクセスできるのがUserAttributesです。

func fetchAttributes() {
    Amplify.Auth.fetchUserAttributes() { result in
        switch result {
        case .success(let attributes):
            print("User attributes - \(attributes)")
        case .failure(let error):
            print("Fetching user attributes failed with error \(error)")
        }
    }
}

こんな感じでattributesに格納されAuthUserAttributeの配列が取得されます。 f:id:ka0in:20200916214619p:plain

通常であれば、AuthUserAttributeKeyでアクセスしてそのvalueを取得しますがemailとname以外AuthUserAttributeKeyがunknownとして格納されているように見えます。

aws-amplify.github.io

本来であれば上記のAuthUserAttributeKeyが設定されているはずです。そしてAuthUserAttributeKeyの中にuserIdに該当するkeyは見当たりません。

ここでAndroidをみてみます。 AndroidAWSMobileClient.getInstance().userAttributes["KEY"]でアクセスしますが、 f:id:ka0in:20200916214730p:plain

みたいな形で正常にAuthUserAttributeKeyが設定された状態で格納されています。 さらにAuthUserAttributeKeyのsubvalueにuserIdらしきものが入っています。

iOS側でlet email = attributes.filter({ $0.key.rawValue == "sub" }).first?.valueで抜き取ろうとすると成功します。
同じ容量でemailも取得することが可能です。

ちなみにAndroid側でAmplify.Auth.currentUser.userIdで取得した場合とAWSMobileClient.getInstance().userAttributes["sub"]で取得する場合は同じuserIdが取得できるはずです。

みんなのKotlin 現場で役立つ最新ノウハウ!

みんなのKotlin 現場で役立つ最新ノウハウ!