1

さて、私はこの「テンプレート」プロジェクトでこの認証プロセスを理解するのに苦労してきましたが、理解できません。

私がやろうとしているのは基本的なサインインです。そのため、認証トークンを取得できます。以前は、SharedPreference (実際には AccountManager を使用したことはありません) を使用し、残りの Android クライアントから (カスタム SessionManager を介して) アクセスしました。

ここまでで、最初の部分を完了することができました。認証トークンを取得できました。

BoostrapAuthenticatorActivity.java:

 /**
     * Called when response is received from the server for authentication
     * request. See onAuthenticationResult(). Sets the
     * AccountAuthenticatorResult which is sent back to the caller. Also sets
     * the authToken in AccountManager for this account.
     */

    protected void finishLogin() {
        final Account account = new Account(email, Constants.Auth.LZGO_ACCOUNT_TYPE);

        if (requestNewAccount)
            accountManager.addAccountExplicitly(account, password, null);
        else
            accountManager.setPassword(account, password);
        final Intent intent = new Intent();
        authToken = token;
        userToken = user;
        intent.putExtra(KEY_ACCOUNT_NAME, userToken);
        intent.putExtra(KEY_ACCOUNT_TYPE, Constants.Auth.LZGO_ACCOUNT_TYPE);
        if (authTokenType != null
                && authTokenType.equals(Constants.Auth.AUTHTOKEN_TYPE))
            intent.putExtra(KEY_AUTHTOKEN, authToken);
        setAccountAuthenticatorResult(intent.getExtras());
        setResult(RESULT_OK, intent);
        finish();
    }

この値にアクセスするにはどうすればよいですか? このクラスをチェックすると、

BootstrapServiceProvider.java:

@Inject private ApiKeyProvider keyProvider;
@Inject private UserAgentProvider userAgentProvider;

/**
 * Get service for configured key provider
 * <p>
 * This method gets an auth key and so it blocks and shouldn't be called on the main thread.
 *
 * @return bootstrap service
 * @throws IOException
 * @throws AccountsException
 */
public BootstrapService getService() throws IOException, AccountsException {
    return new BootstrapService(keyProvider.getAuthKey(), userAgentProvider);
}

最後に、プロバイダ:

ApiKeyProvider.java:

@Inject private Activity activity;
@Inject private AccountManager accountManager;

/**
 * This call blocks, so shouldn't be called on the UI thread
 *
 * @return API key to be used for authorization with a {@link com.android.lzgo.core.LzgoService} instance
 * @throws AccountsException
 * @throws IOException
 */
public String getAuthKey() throws AccountsException, IOException {
    AccountManagerFuture<Bundle> accountManagerFuture = accountManager.getAuthTokenByFeatures(Constants.Auth.BOOTSTRAP_ACCOUNT_TYPE,
            Constants.Auth.AUTHTOKEN_TYPE, new String[0], activity, null, null, null, null);
    Log.d("ApiKeyProvider", "ApiKeyProvider= " + accountManagerFuture.getResult().getString(KEY_AUTHTOKEN));
    return accountManagerFuture.getResult().getString(KEY_AUTHTOKEN);
}

しかし、これは私にnull値を取得します! 私は迷っています!

4

1 に答える 1

3

によって authtoken が正しく適用されない理由はわかりませんが、次の呼び出しをsetAccountAuthenticatorResult(...)追加することで運が良かったですaccountManager.setAuthToken(...)finishLogin()

if (authTokenType != null
            && authTokenType.equals(Constants.Auth.AUTHTOKEN_TYPE)) {
        intent.putExtra(KEY_AUTHTOKEN, authToken);
        accountManager.setAuthToken(account, authTokenType, authToken);
}

おそらくこれは、Parse.com をバックエンドとして使用していないことに関係しているのでしょうか?

于 2013-01-07T21:40:59.047 に答える