モケラ

Tech Sheets

mokelab

アクセストークン取得を実装する

最終更新日:2015-07-01

アカウントを取得できたら、最後にアクセストークンを取得してみます。

ここまで実装したものはここにあります。

アカウント利用側

アカウントのアクセストークンを取得するには、AccountManagerのgetAuthToken()を使用します。このAPIを使うにはandroid.permission.USE_CREDENTIALSが必要です。AndroidManifest.xmlにを追加します。

private void requestToken(String name, String type) {
    Account account = new Account(name, type);
    AccountManager manager = AccountManager.get(this);
    manager.getAuthToken(account, "com.mokelab.accountsample", null, this, new AccountManagerCallback<Bundle>() {
        @Override
        public void run(AccountManagerFuture<Bundle> accountManagerFuture) {
            try {
                Bundle result = accountManagerFuture.getResult();
                String token = result.getString(AccountManager.KEY_AUTHTOKEN);

                Log.v("getToken", "token=" + token);
            } catch (OperationCanceledException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (AuthenticatorException e) {
                e.printStackTrace();
            }
        }
    }, null);
}

第1引数には該当のアカウント、第2引数にはトークンの種類を指定します。トークンの取得は非同期で行われるので、callbackオブジェクトも渡します。

Authenticator側の実装

クライアントがgetAuthToken()を呼ぶと、AuthenticatorのgetAuthToken()が呼ばれるので実装します。Android SDKのサンプルの通りに実装してみました。

public Bundle getAuthToken(final AccountAuthenticatorResponse response, final Account account,
                           final String authTokenType, Bundle bundle) throws NetworkErrorException {
    // 1. check authTokenType
    if (!TOKEN_TYPE.equals(authTokenType)) {
        Bundle result = new Bundle();
        result.putString(AccountManager.KEY_ERROR_MESSAGE, "invalid authTokenType");
        return result;
    }

    // 2. get password
    AccountManager accountManager = AccountManager.get(mContext);
    String password = accountManager.getPassword(account);
    if (password == null) {
        Intent it = LoginActivity.createAuthIntent(mContext, response, account, authTokenType);
        Bundle result = new Bundle();
        result.putParcelable(AccountManager.KEY_INTENT, it);
        return bundle;
    }
    // 3. get token
    mUserAPI.login(account.name, password, new UserAPI.GetTokenListener() {
        @Override
        public void onSuccess(String token) {
            Bundle result = new Bundle();
            result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
            result.putString(AccountManager.KEY_ACCOUNT_TYPE, "com.mokelab.accountsample");
            result.putString(AccountManager.KEY_AUTHTOKEN, token);
            response.onResult(result);
        }

        @Override
        public void onError(Exception e) {
            response.onError(1, "Failed to get token");
        }
    });
    return null;
}

まず、authTokenTypeを確認します。この文字列を知っている人のみアクセス可能にしておきます。

次に、AccountManagerのgetPassword()で渡されたアカウントのパスワードを取得します。もし、パスワードが取得できたらサーバーに問い合わせてアクセストークンを取得します。パスワードが設定されていない場合は、再度ログイン画面を表示する といったこともできます(今回は省略)。

サーバーと通信するためのライブラリが非同期APIを用意している場合は、上記コードのように一旦nullを返し、非同期APIのcallback部分でresponse.onResult(result);を呼ぶようにします。

一覧に戻る