2

我正在针对应用引擎服务器对 android 应用进行身份验证,基本上遵循这篇文章: http: //blog.notdot.net/2010/05/Authenticating-against-App-Engine-from-an-Android-app

看来我在过程结束时得到的 cookie 不好 - 我得到 401,所以我尝试复制 cookie 并在浏览器中对其进行测试,但仍然得到 401。将浏览器 cookie 复制到 android应用程序,请求有效。

我怎么会得到一个无效的 cookie?我什至尝试过使令牌无效,但仍然得到相同的结果......

4

3 回答 3

2

不要费心自己做这件事。使用这个: http: //loopj.com/android-async-http/

于 2012-12-22T00:35:24.300 回答
2

出于某种原因,这行得通:我将初始 cookie 请求的 URL 从 https 更改为 http,然后将其更改回来。

但最后我决定改变我的实现,并按照alistair的建议使用 loopj。结果要优雅得多。这是我的登录活动(请注意,我正在将客户端连接到 loopj api 提供的持久 cookie 存储):

public class AccountList extends ListActivity {
    protected AccountManager accountManager;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        accountManager = AccountManager.get(getApplicationContext());
        Account[] accounts = accountManager.getAccountsByType("com.google");
        this.setListAdapter(new ArrayAdapter<Account>(this, R.layout.list_item, accounts));   
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        Account account = (Account)getListView().getItemAtPosition(position);
        accountManager.invalidateAuthToken("com.google", null);
        accountManager.getAuthToken(account, "ah", null, this, new GetAuthTokenCallback(), null);
    }

    private class GetAuthTokenCallback implements AccountManagerCallback<Bundle> {
        public void run(AccountManagerFuture<Bundle> result) {
            AsyncHttpClient client = new AsyncHttpClient();
            PersistentCookieStore myCookieStore = new PersistentCookieStore(getBaseContext());
            client.setCookieStore(myCookieStore);
            try {
                Bundle bundle;
                bundle = result.getResult();
                Intent intent = (Intent)bundle.get(AccountManager.KEY_INTENT);
                if(intent != null) {
                    // User input required
                    startActivity(intent);
                } else {
                    String token = bundle.getString(AccountManager.KEY_AUTHTOKEN);
                    String url = "http://myapp.appspot.com/_ah/login?continue=http://localhost/&auth=" + token;
                    client.post(url, new AsyncHttpResponseHandler());
                    Intent backToMainActivity = new Intent(getApplicationContext(), MainActivity.class);
                    startActivity(backToMainActivity);
                }
            } catch (OperationCanceledException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (AuthenticatorException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

因为 loopj 提供了持久 cookie 存储,所以我在另一个活动中所要做的就是初始化一个客户端并将其与持久 cookie 存储连接。这为新客户端提供了我从登录活动中获得的所有 cookie。初始化看起来像这样:

AsyncHttpClient client = new AsyncHttpClient();
client.setCookieStore(new PersistentCookieStore(this));

BTW & FYI:loopj 库使用SharedPreferencesAPI 来存储 cookie,并将其很好地包装为PersistentCookieStore.

于 2012-12-23T11:28:57.107 回答
0

不知道您使用的是什么httpclient。

也许它会有助于阅读关于 cookie 的 apache 文档......

于 2012-12-22T16:10:49.010 回答