LoginSignup
10
9

More than 5 years have passed since last update.

GoogleAuthUtilを使ってOAuth 2.0 tokenを取得する

Posted at

GoogleAuthUtilを使ってOAuth 2.0 tokenを取得する

GoogleアカウントでsigninしてGoogleのサービスを使うにはGoogleApiClientを使うのが手っ取り早く、tokenを意識することなく各種サービスにアクセスできる。ただ、tokenが必要なユースケースも依然としてあり、GoogleAuthUtilを使ってtokenを取得する必要が出てきたので、簡単な取得サンプルを作ってみた。

サンプルコードのポイントは

  • sign-in起動用のボタンbuttonと、取得したtoken表示用のTextView tokenを適当に画面にlayoutしておく。
  • 既にSettings>Accountsで登録されているGoogleのアカウント名をAccountManager経由で読み出す。このためAndroidManifest.xmlにGET_ACCOUNTSのpermissionが必要。
  • AsyncTaskでバックグラウンドでgoogle tokenを取得する。はじめてsign-inするときにはUserRecoverableAuthExceptionが返ってくるので、user consent画面をstartActivityForResult()する。
MainActivity.java
package jp.gr.java_conf.fofn.googleauthutil;

import android.accounts.Account;
import android.accounts.AccountManager;
import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

import com.google.android.gms.auth.GoogleAuthException;
import com.google.android.gms.auth.GoogleAuthUtil;
import com.google.android.gms.auth.UserRecoverableAuthException;

import java.io.IOException;

public class MainActivity extends Activity {

    private static final String TAG = "AUTH_SAMPLE";
    private static final String ACCOUNT_TYPE_GOOGLE = "com.google";
    private static final String AUTH_SCOPE = "oauth2:profile email";
    private static final int REQUEST_SIGN_IN = 10000;

    private String mAccountName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getGoogleToken(mAccountName);
            }
        });

        // Get google account
        AccountManager accountManager = AccountManager.get(this);
        Account[] accounts = accountManager.getAccountsByType(ACCOUNT_TYPE_GOOGLE);
        mAccountName = accounts[0].name; // it's better to open account chooser.
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_SIGN_IN && resultCode == RESULT_OK) {
            getGoogleToken(mAccountName);
        }
    }

    private void getGoogleToken(String accountName) {

        AsyncTask<String, Void, String> task = new AsyncTask<String, Void, String> () {
            @Override
            protected String doInBackground(String... accounts) {
                String scopes = AUTH_SCOPE;
                String token = null;
                try {
                    token = GoogleAuthUtil.getToken(getApplicationContext(), accounts[0], scopes);
                } catch (IOException e) {
                    Log.e(TAG, e.getMessage());
                } catch (UserRecoverableAuthException e) {
                    startActivityForResult(e.getIntent(), REQUEST_SIGN_IN);
                } catch (GoogleAuthException e) {
                    Log.e(TAG, e.getMessage());
                }
                return token;
            }

            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                ((TextView) findViewById(R.id.token)).setText(s);
            }
        };

        task.execute(accountName);
    }
}
10
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9