あなたの Androidアプリに Googleサインインを統合する



  • この記事は、Google Sign-In for Android に関する記事を和訳したものです。
  • 原文: Integrating Google Sign-In into Your Android App
  • 元記事のライセンスは CC-BYで、この和訳記事のライセンスは CC-BYです。
  • 自己責任でご利用ください。
  • 和訳した時期は 2019年6月ころです。

あなたの Androidアプリに Googleサインインを統合するには、Googleサインインを構成し、サインインフローを開始するボタンをあなたのアプリのレイアウトに追加します。

始める前に

Google API Consoleプロジェクトを構成し、あなたの Android Studioプロジェクトをセットアップします

Googleサインイン、および、GoogleSignInClientオブジェクトを構成する

  1. あなたのサインインアクティビティの onCreateメソッドにて、あなたのアプリによって必要とされるユーザデータをリクエストするために、Googleサインインを構成します。 例えば、ユーザの ID、および基本的なプロフィール情報をリクエストする Googleサインインを構成するには、DEFAULT_SIGN_INパラメータを用いて GoogleSignInOptionsオブジェクトを作成します。 ユーザの電子メールアドレスをリクエストするには、同様に、requestEmailオプションを用いて GoogleSignInOptionsオブジェクトを作成します。

    // Configure sign-in to request the user's ID, email address, and basic
    // profile. ID and basic profile are included in DEFAULT_SIGN_IN.
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .build();

    もし Google APIにアクセスするための追加のスコープをリクエストする必要があるならば、requestScopesを用いてそれらを指定します。 最高のユーザエクスペリエンスのため、サインイン時には、あなたのアプリが最低限機能するために必要とされるスコープのみをリクエストします。 必要とするときのみ追加のスコープをリクエストします、そうすれば、あなたのユーザには、彼らが実行したアクションのコンテキストにて同意画面が表示されます。 追加のスコープをリクエストするを参照してください。

  2. それから、あなたのサインインアクティビティの onCreateメソッドにて、指定したオプションを用いて GoogleSignInClientオブジェクトを作成します。

    // Build a GoogleSignInClient with the options specified by gso.
    mGoogleSignInClient = GoogleSignIn.getClient(this, gso);

既存のユーザのサインをチェックする

あなたのアクティビティの onStartメソッドにて、ユーザが、既に Googleを用いてあなたのアプリにサインインしているかどうかをチェックします。

// Check for existing Google Sign In account, if the user is already signed in
// the GoogleSignInAccount will be non-null.
GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
updateUI(account);

もし GoogleSignIn.getLastSignedInAccountが (nullではなく) GoogleSignInAccountオブジェクトを返すならば、ユーザは、既に Googleを用いてあなたのアプリにサインインしています。 あなたの UIをそれに応じて更新します — つまり、サインインボタンを非表示にする、あなたのメインアクティビティを起動する、あるいは、あなたのアプリに適切なものは何でもです。

もし GoogleSignIn.getLastSignedInAccountnullを返したならば、ユーザは、まだ Googleを用いてあなたのアプリにサインインしていません。 あなたの UIに Googleサインインボタンを表示するよう更新します。

あなたのアプリに Googleサインインボタンを追加する

  1. The standard Google sign-in button あなたのアプリケーションのレイアウトに SignInButtonを追加します:

    <com.google.android.gms.common.SignInButton
     android:id="@+id/sign_in_button"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content" />
    
  2. オプション: もし、独自のサインインボタンのアセットを提供する代わりにデフォルトのサインインボタンのグラフィックスを使用しているならば、setSizeメソッドを用いてボタンのサイズをカスタマイズすることができます。

    // Set the dimensions of the sign-in button.
    SignInButton signInButton = findViewById(R.id.sign_in_button);
    signInButton.setSize(SignInButton.SIZE_STANDARD);
    
  3. Androidアクティビティにて(例えば、onCreateメソッドにて)、クリックしたときにユーザをサインインさせるために、あなたのボタンの OnClickListenerを登録します:

    findViewById(R.id.sign_in_button).setOnClickListener(this);
    

サインインフローを開始する

  1. Image of the Sign-In account chooser アクティビティの onClickメソッドにて、getSignInIntentメソッドを用いてサインインインテントを作成することによって、サインインボタンのタップを処理します、そして、startActivityForResultを用いてインテントを開始します。

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.sign_in_button:
                signIn();
                break;
            // ...
        }
    }
    
    private void signIn() {
        Intent signInIntent = mGoogleSignInClient.getSignInIntent();
        startActivityForResult(signInIntent, RC_SIGN_IN);
    }

    インテントを開始すると、ユーザに、サインインに用いる Googleアカウントを選択するよう促します。 もし profileemail、および openid以外のスコープをリクエストしたならば、ユーザは、リクエストされたリソースにアクセス権を付与することも求められます。

  2. ユーザがサインインした後、アクティビティの onActivityResultメソッドにて、ユーザのための GoogleSignInAccountオブジェクトを取得することができます。

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        // Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);
        if (requestCode == RC_SIGN_IN) {
            // The Task returned from this call is always completed, no need to attach
            // a listener.
            Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
            handleSignInResult(task);
        }
    }

    GoogleSignInAccountオブジェクトは、ユーザ名といった、サインインしたユーザについての情報を含んでいます。

    private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
        try {
            GoogleSignInAccount account = completedTask.getResult(ApiException.class);
    
            // Signed in successfully, show authenticated UI.
            updateUI(account);
        } catch (ApiException e) {
            // The ApiException status code indicates the detailed failure reason.
            // Please refer to the GoogleSignInStatusCodes class reference for more information.
            Log.w(TAG, "signInResult:failed code=" + e.getStatusCode());
            updateUI(null);
        }
    }

    getEmailを用いてユーザの電子メールアドレスを、getIdを用いてユーザの Google ID(クライアント側で使用するため)を、getIdTokenを用いてユーザの IDトークンを取得することもできます。 もし、現在サインインしているユーザをバックエンドサーバに渡す必要があるならば、IDトークンをあなたのバックエンドサーバに送信し、サーバ上のトークンを検証します。