Google AppEngine(+OAuth2)にAndroid AccountManagerを介してリクエストする
chrome.identity APIを使ってGoogle App Engine OAuth2を使うの続き
前回ではJavaScript(Chrome Extension)側からchrome.identityのAPIを利用してアクセスしてレスポンスを取るみたいな事しましたが、AndroidでAccountManagerを使って端末に紐付けしてあるGoogleアカウントを使ってリクエストする場合どうなるのって事でやってみた
AccountManagerを利用してアクセストークンを取得し、そのトークンをAuthorizationヘッダーに「Bearer トークン」として設定してリクエストするだけ。それだけでいいっぽい
package sample.test;
import java.io.IOException;
import android.app.Activity;
import android.os.Bundle;
import android.accounts.AccountManager;
import android.accounts.AccountManagerCallback;
import android.accounts.AccountManagerFuture;
public class MainActivity extends Activity {
    // authTokenTypeにOAuth2を使う場合には権限スコープ名の前にoauth2:の接頭辞を付ける
    private static final String SCOPE = "oauth2:https://www.googleapis.com/auth/userinfo.email";
    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
    }
    @Override
    public void onStart() {
        super.onStart();
        final AccountManager am = AccountManager.get(this);
        am.getAuthTokenByFeatures(
            "com.google",
            SCOPE,
            null,
            this,
            null,
            null,
            new AccountManagerCallback<Bundle>() {
                @Override
                public void run(AccountManagerFuture<Bundle> result) {
                    String token = null;
                    try {
                        Bundle b = result.getReslt();
                        token = b.getString(AccountManager.KEY_AUTHTOKEN);
                        request(token);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            },
            null
        );
    }
    private void request(String token) {
        // 引数のトークンをAuthorizationヘッダーに「Bearer トークン」として設定してOAuthServiceを使っているURLに対してリクエストする
    }
}
まぁ単純で要点だけ挙げると
- getAuthToken周りを行う際に指定するauthTokenTypeにはoauth2接頭辞をつけたスコープを指定する
 - OAuthService.getCurrentUser等のAPIをコールしているURLにて「Authorization: Bearer トークン」のAuthorizationヘッダーを設定してリクエストする
 
ただこれだけ。やると

みたいに表示される(OAuthService.getCurrentUser().getNickname()を出力しているだけ)
まぁ単純なので検証する必要無いんじゃないかって思ったけど一応ネタとして書いておく