Android对app引擎服务器的请求失败(401)

时间:2012-12-22 00:30:21

标签: android google-app-engine authentication cookies httpclient

我正在针对应用引擎服务器对Android应用进行身份验证,基本上是关注此帖子:http://blog.notdot.net/2010/05/Authenticating-against-App-Engine-from-an-Android-app

似乎我在流程结束时得到的cookie不好 - 我得到401,所以我尝试复制cookie并在浏览器中测试它,并且仍然获得401.当复制浏览器cookie时对于Android应用程序,请求有效。

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

3 个答案:

答案 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 ...