アクセストークン取得を実装する
最終更新日: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);を呼ぶようにします。