AWS Amplifyを用いたAndroidでのGoogle認証

# Google認証プロバイダーの作成
以下のAmplifyのドキュメントを参考に実施してみました。
https://docs.amplify.aws/lib/auth/social_signin_web_ui/q/platform/android/
## 同意画面の作成
1. Googleデベロッパーコンソールを開く
https://console.cloud.google.com/apis/dashboard

1. [▼]（プルダウン）を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/50758d14-79e3-cbd7-b28f-1d3a3c9aa52b.png)


1. [新しいプロジェクト]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/ae5a4ef3-4afb-a2bd-97f8-ab4579224b50.png)

1. [プロジェクト名]を設定し、[作成]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/ddc1f33a-5a16-2d0f-423f-deb6d83e19e7.png)

1. 作成後に、[プロジェクトを選択]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/23e826f8-51c8-119d-2fe6-c192499628a5.png)

1. [APIとサービス]⇒[認証情報]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/dade192e-8326-4da6-16e8-f4719b67ee41.png)


1. [同意画面を構成]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/8d69e2fd-c27b-1888-bc59-d500b04d733c.png)

1. [作成]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/d09a0859-ac14-c2f5-2ee3-ea46a680b20e.png)

1. 必須項目(アプリ名、ユーザーサポートメール、デベロッパーの連絡先情報)を設定し、[保存して次へ]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/22b46caa-f65b-2f6e-3e98-3cbf14606cf0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/27c149f8-bbe5-e4cb-1014-5aab3d1c49be.png)

1.スコープ設定画面で、 [保存して次へ]（ページの下部）
任意でスコープ設定を実施。今回は特に必要ないので設定しない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/4e538dac-0392-495f-f4d1-f3df9a85eff9.png)


1. テストユーザー設定画面で、任意のテストユーザを設定し、[保存して次へ]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/cdb2ca2b-4e9e-8274-10fe-09aedd392140.png)

1. 設定内容の確認
設定内容の確認のみ実施します。このページでの操作はありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/fbdd18a7-cc65-a610-043e-97b506e854a0.png)


## ClientIdの作成
1. [認証情報]⇒[認証情報を作成]⇒[OAuth クライアントID]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/d4d02c39-8288-5f46-b8ed-a7f544b4332c.png)

1. 必須項目を設定し、[作成]
アプリケーションの種類：ウェブアプリケーション
名前：AmplifyAuth(任意の名称)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/40e71487-c5b4-46dd-f272-363a1824745c.png)

1. [クライアントID], [クライアントシークレット]を取得
※後続のAmplifyの設定で使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/27201bf8-0283-fa66-4644-b9f2763253ce.png)

  
# Android Projectの作成
1. [Empty Activity]を選択し、[次へ]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/eb1907db-2173-e9eb-59e0-32290f9a36d1.png)

1. 各項目に任意の値を入力し、[完了]
Name：任意
Package name：任意
Save location：任意
Language：Kotlin
Minimum SDK：API 26: Android 8.0(Oreo) ※なるべく最新が良い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/cf401432-24aa-5bd8-7339-7f299990c37d.png)


# Amplify用IAMユーザの作成
1. コマンドプロンプトから[amplify configure]を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/8c3c4aff-e460-7e60-eac4-688cf2ca8f2d.png)

1. [Enter]を押す
AWSにログインしていない場合は、ブラウザでログイン画面が開かれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/66488024-8e85-c563-e464-dab1b0ad8dde.png)

1. 日本リージョンである[ap-northeast-1]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/78b00edf-a5f2-f41e-93d8-fbca76feee62.png)

1. 任意のユーザー名を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/b59623f2-a56b-e75d-d7e6-c008b6408078.png)

1. IAMユーザの設定画面が開かれるので、[ユーザー名]を確認し、[次のステップ:アクセス権限]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/7da04c24-fc11-1915-ef25-df2d1da24a2a.png)

1. [次のステップ:タグ]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/c4090fc4-8b40-9fed-9aea-2988e481251e.png)

1. 任意のタグを追加して、[次のステップ:確認]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/9f0bcce5-9460-80f0-255b-2a4a84cd50ef.png)

1. [ユーザーの作成]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/96c75cf9-7c24-6da7-2653-08548f2bc9a8.png)

1. [アクセスキーID], [シークレットアクセスキー]を取得し、[閉じる]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/9c70377c-e267-ed74-1dd0-233e1db6ee7b.png)

1. コマンドプロンプトに戻り、[Enter]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/4231e1d6-f6e1-3a80-8f56-b49a9385fa15.png)


1. [アクセスキーID(accessKeyId)], [シークレットアクセスキー(secretAccessKey)]を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/c9f63f9f-cd83-5aa9-b67b-9f1162b70df2.png)


1. 任意の[Profile Name]を入力
![01_conf_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/06964545-4d03-ad6c-4254-5045bd6742de.png)


1. 設定完了
![01_conf_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/b71b6eac-20b5-2f46-9ce5-3d19f167498a.png)

# Amplifyの初期化
1. コマンドプロンプトを開き、作成したAndroid Projetのルートフォルダーへ移動
例)cd /d [ルートフォルダーのパス]
下図のようなルートディレクトリへ移動
![init01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/3dd7a473-bb1d-5f2d-3cad-ca49976ed00b.png)
![init02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/882a4401-9fb9-a7e1-54c0-30c376be5014.png)


1. [Amplify init]を実行
![init03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/cd50beed-95d4-251d-82dc-037b9213866f.png)

1. Amplifyのプロジェクト名を入力
![init04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/59972b8c-3178-a4ad-7e08-5a15ba1f6ba4.png)

1. [n]を入力
![init05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/afc4b92c-43b8-7905-a85c-89e850700572.png)

1. 任意の環境名を入力（今回は、dev）
![init06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/c021f46c-c973-c0b9-54df-334a625b03db.png)

1. 開発環境（IDE）を[Android Stdio]を選択
![init07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/2f0af829-a115-b574-52e8-c96a9f81d162.png)

1. 対象のアプリを選択([Android]を選択)
![init08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/10928b83-6470-98d7-7baa-feabcdc1d9fe.png)

1. Res directoryを選択（Default値でOk）
![init09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/fbed1527-4d94-6884-3c63-289799b6a840.png)

1. [AWS profile]を選択
![init10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/cf5c477c-5b31-fee8-66cf-4be5a4f7285c.png)

1. 「Amplify用IAMユーザの作成」で作成したプロファイルの[AmplifyAuth]を選択
![init11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/e7cfeaf5-9238-c600-b5f9-3b958e716d15.png)

1. 初期化が開始される。完了まで待機
下図は初期化完了後
![init12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/0f2fa725-5c0a-21be-3b09-4fb9ab73d949.png)


# Amplifyに認証設定を追加
1. コマンドプロンプトから[amplify add auth]を実行
※実行ディレクトリは、[amplify init]を実行したプロジェクトのルートディレクトリから実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/846e4080-5969-3bbf-c423-1d1b8e1c019f.png)

1. [Default configuration with Social Provider (Federation)]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/ce7b04f0-d773-d795-9d7d-9a08b0dae03b.png)

1. [Username]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/86a135f4-5b1b-44f5-8cdd-c30c3d87bfd6.png)

1. [No, I am done.]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/1dc70f34-e5e0-b39c-cfb5-4cae55af6b52.png)

1. 任意のドメイン名を入力（[amplifyauth]を入力）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/bb6bbed7-27e8-9142-b138-f0e57d82507f.png)

1. 認可画面のリダイレクトURIとして[myapp://callback/]を入力
※後続の手順で、Android Projectへの設定も追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/1f27fe1a-d716-234c-d92d-3f233827ee5a.png)

1. [N]を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/c4e7cfec-0200-01dc-32bd-ef073eacc0ce.png)

1. サインアウト時のリダイレクトURIとして[myapp://sigout]を入力
※設定値として入力するだけで、今回の手順ではサインアウトは実行しません
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/277d7d28-4888-0668-1dee-db9a1ca0a0e5.png)


1. [N]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/2a7b869b-4123-a95f-41fe-4c9528f79a57.png)

1. [Google]を選択
※<スペースキー>で選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/81b76edd-3c7d-1455-783a-1df4dfbc7cd0.png)

1. [Google認証プロバイダーの作成]⇒[ClientIdの作成]の手順で取得した、Googleの[クライアントID], [クライアントシークレット]を設定
![pic02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/2b363201-58f6-6379-50d9-22555bf8a101.png)

1. [amplify push]を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/54babad8-cac5-5c58-570c-6734df2704c8.png)


1. [Y]を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/32fbb5a7-da5f-3a1e-b921-95947d6c8000.png)

1. Push完了後に、AWS上のHostedUIのURLが表示されるため、取得して保存しておく
※[amplify status]でも確認できます。
![pic01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/fd3a251a-4f58-e8f3-ef39-49c43f1bc489.png)



# Google認証プロバイダーにAmplifyのHostedUIの設定
1. [認証情報]⇒[Oauth 2.0 クライアント ID]⇒作成したクライアント(AmplifyAuth)を選択
![pushu04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/af4fb0ef-676c-bcd5-3183-ed52c84c3af8.png)

1. [承認済みのJavaScript生成元]、[承認済みのリダイレクトURI]を入力し、[保存]
承認済みのJavaScript生成：HostedUIのドメイン名
承認済みのリダイレクトURI：HostedUIのドメイン名/oauth2/idpresponse
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/8c4e19c5-e6e7-a9f2-5569-08e948741dd5.png)




# Android ProjectへGoogle認証実装
1. 作成したAndroid Projectを開き、[build.gradle]の設定を変更
dependenciesに[com.amplifyframework], [com.android.tools], [com.amplifyframework:aws-auth-cognito]を追加


    ```gradle:build.gradle
    plugins {
        id 'com.android.application'
        id 'kotlin-android'
    }

    android {
        compileSdk 31

        defaultConfig {
            applicationId "com.sample.amplifyauth"
            minSdk 26
            targetSdk 31
            versionCode 1
            versionName "1.0"

            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        }

        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
        }
        compileOptions {
            // Support for Java 8 features
            coreLibraryDesugaringEnabled true
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
        kotlinOptions {
            jvmTarget = '1.8'
        }
    }

    dependencies {

        implementation 'androidx.core:core-ktx:1.7.0'
        implementation 'androidx.appcompat:appcompat:1.4.1'
        implementation 'com.google.android.material:material:1.5.0'
        implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
        testImplementation 'junit:junit:4.+'
        androidTestImplementation 'androidx.test.ext:junit:1.1.3'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'

        // 追加
        implementation 'com.amplifyframework:core:1.33.0'
        coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
        implementation 'com.amplifyframework:aws-auth-cognito:1.33.0'
    }
    ```

1. [Sync Now]を押して、設定反映
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/eb0541af-e5a8-c3ee-10e9-2ff56a839cce.png)

1. [AndroidManifest.xml]の変更


    ```xml:AndroidManifest.xml
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.sample.amplifyauth">

        <!-- queries を追加 -->
        <queries>
            <intent>
                <action android:name="android.intent.action.VIEW" />
                <data android:scheme="https" />
            </intent>
            <intent>
                <action android:name=
                    "android.support.customtabs.action.CustomTabsService" />
            </intent>
        </queries>

        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/Theme.AmplifyAuth">
            <activity
                android:name=".MainActivity"
                android:exported="true">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />

                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activitya>

            <!-- Activityを追加 -->
            <activity
                android:name="com.amplifyframework.auth.cognito.activities.HostedUIRedirectActivity"
                android:exported="true">
                <intent-filter>
                    <action android:name="android.intent.action.VIEW" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="android.intent.category.BROWSABLE" />
                    <data android:scheme="myapp" />
                </intent-filter>
            </activity>
        </application>

    </manifest>

    ```
1. 認可画面表示用ロジックの追加
[MainActivity.kt]を以下のように変更


    ```kotlin:AndroidManifest.xml
    package com.sample.amplifyauth

    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import android.util.Log
    import com.amplifyframework.auth.AuthProvider
    import com.amplifyframework.auth.cognito.AWSCognitoAuthPlugin
    import com.amplifyframework.core.Amplify

    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)

            // Add this line, to include the Auth plugin.
            Amplify.addPlugin(AWSCognitoAuthPlugin())
            Amplify.configure(applicationContext)

            Amplify.Auth.signInWithSocialWebUI(AuthProvider.google(), this,
                { Log.i("AuthQuickstart", "Sign in OK: $it") },
                { Log.e("AuthQuickstart", "Sign in failed", it) }
            )
        }
    }

    ```

1. 実行すると、Googleの認証画面が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162829/973f354a-4b9f-06b0-b31a-9bfeadf61b9f.png)