我正在针对应用引擎服务器对Android应用进行身份验证,基本上是关注此帖子:http://blog.notdot.net/2010/05/Authenticating-against-App-Engine-from-an-Android-app。
似乎我在流程结束时得到的cookie不好 - 我得到401,所以我尝试复制cookie并在浏览器中测试它,并且仍然获得401.当复制浏览器cookie时对于Android应用程序,请求有效。
我怎么能得到一个无效的cookie?我甚至试过使令牌无效,但仍然得到相同的结果......
答案 0 :(得分:2)
不要打扰自己这样做。使用此:http://loopj.com/android-async-http/
答案 1 :(得分: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));
&lt; BTW&amp;仅供参考:loopj库使用SharedPreferences
API来存储cookie,并将其很好地包装为PersistentCookieStore
。
答案 2 :(得分:0)
不知道你正在使用什么httpclient。
也许有助于阅读apache docs on cookies ...