GAE не распознает Cookie?

Я играю вокруг с GAE и Android, пытаясь получить приложение, сделанное для веб-сервиса. Я выполняю шаги по получению маркера аутентификации от AccountManager на Android, получению необходимого Cookie, затем прикрепляю этот Cookie к GET-запросу, который обрабатывает питон-приложение GAE. По какой-то причине приложение GAE, похоже, не распознает куки или что-то в этом роде. Извините за большой пост, я решил, что приведу здесь как можно больше кода, чтобы помочь объяснить.

У меня есть базовый класс в GAE, чтобы проверить, распознан ли пользователь.

class TestUser(webapp.RequestHandler):
  def get(self):
    if users.get_current_user():
        self.response.out.write(users.get_current_user().nickname())
    else:
        self.response.out.write('no user')

application = webapp.WSGIApplication([
  ('/', MainPage),
  ('/testuser', TestUser)
], debug=True)

def main():
  run_wsgi_app(application)

if __name__ == '__main__':
  main()

Из браузера это работает отлично. Я вижу пользователя. При выполнении на Android я получаю "нет пользователя".

Вот куча кода для Android:

onCreate:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        cookieLength = (TextView)findViewById(R.id.cookielength);

        cookie = "";        

        AccountManager manager = AccountManager.get(getApplicationContext());
        Account[] accounts = manager.getAccountsByType("com.google"); 
        new GetAuthTokenTask().execute(accounts);
    }

Получаем токен авторизации, аннулируем его и получаем снова, чтобы избежать просроченных токенов:

private class GetAuthTokenTask extends AsyncTask<Account, Object, String> {

    @Override
    protected String doInBackground(Account... accounts) {
        AccountManager manager = AccountManager.get(getApplicationContext());
        Account account = accounts[0];
        String token = this.buildToken(manager, account);
        Log.d(TAG, "First token: "+token);
        manager.invalidateAuthToken(account.type, token);
        return this.buildToken(manager, account);
    }

    private String buildToken(AccountManager manager, Account account) {
        try {
            AccountManagerFuture<Bundle> future = manager.getAuthToken (account, "ah", false, null, null);
            Bundle bundle = future.getResult();
            return bundle.getString(AccountManager.KEY_AUTHTOKEN);
         } catch (OperationCanceledException e) {
                Log.w(TAG, e.getMessage());
         } catch (AuthenticatorException e) {
                Log.w(TAG, e.getMessage());
         } catch (IOException e) {
                Log.w(TAG, e.getMessage());
         }
         return null;
    }

    protected void onPostExecute(String authToken) {
        Log.d(TAG, "Second token: "+authToken);
        getCookie(authToken);
    }
}

Получаем cookie пользователя, хранящиеся в глобальной строке cookie.

private void getCookie(final String authToken) {
    new Thread(new Runnable() {
        public void run() {
            String href = "https://someawesomeapp.appspot.com/_ah/login?continue=http://localhost/&auth="+authToken;
            Log.d(TAG, "href: "+href);

            DefaultHttpClient httpclient = new DefaultHttpClient();
            final HttpParams params = new BasicHttpParams();
            HttpClientParams.setRedirecting(params, false);
            httpclient.setParams(params);
            HttpGet httpget = new HttpGet(href);
            try {
                    HttpResponse response = httpclient.execute(httpget);
                    HttpEntity entity = response.getEntity();
                    if (entity != null) {
                        entity.consumeContent();
                    }
                    List<Cookie> cookies = httpclient.getCookieStore().getCookies();
                    Log.d(TAG, "Cookies");
                    if (cookies.isEmpty()) {
                        Log.d(TAG, "None");
                    } else {
                        for (int i = 0; i < cookies.size(); i++) {
                            Log.d(TAG, "- " + cookies.get(i).toString());
                            Cookie c = cookies.get(i);
                            Log.d(TAG, "cookie.getname(): "+c.getName());
                            if (c.getName().contentEquals("SACSID")) {
                                Log.d(TAG, "Found SACSID cookie");
                                cookie = c.getValue();
                                Log.d(TAG, "cookie now set to: "+cookie);
                            }
                        }
                    }
                } catch (ClientProtocolException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

        }
    }).start();
}

Теперь у нас есть сохраненная cookie, пользователь нажал кнопку Test User в интерфейсе, это выполняется:

public void testUser(View view) { Log.d(TAG, "testUser()");

String href = "http://someawesomeapp.appspot.com/testuser";


DefaultHttpClient httpclient = new DefaultHttpClient();
    final HttpParams params = new BasicHttpParams();
    HttpClientParams.setRedirecting(params, false);
    httpclient.setParams(params);
    HttpGet httpget = new HttpGet(href);
    httpget.setHeader("Cookie", cookie);
    try {
        HttpResponse response = httpclient.execute(httpget);
        StatusLine status = response.getStatusLine();
        if (status.getStatusCode() != 200) {
            throw new IOException("Invalid response from server: " + status.toString());
        }
        HttpEntity entity = response.getEntity();
        if (entity != null) {
            //entity.consumeContent();
            InputStream inputStream = entity.getContent();
            ByteArrayOutputStream content = new ByteArrayOutputStream();

            // Read response into a buffered stream
            int readBytes = 0;
            byte[] sBuffer = new byte[512];
            while ((readBytes = inputStream.read(sBuffer)) != -1) {
                content.write(sBuffer, 0, readBytes);
            }
            String dataAsString = new String(content.toByteArray());
            Log.d(TAG, "response: "+dataAsString);
        }

    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

Вот снимок соединения из WireShark:

GET /testuser HTTP/1.1
Cookie: AJKiYcEcp6zZHFUoNU5KVlEII_wcWzlBoRQpo-KQ0T_4lwoo0znXn6t7oKpmpa7ctaVY58GO5BmwxkSZ4yZ-e7EOuwTZxeGAuKwI2YrisqjnNuQB36wuzlyBfdY6c7ECcVXuu7BNYlYJtDoB7zJDUCeSXfBmGzrfSh3fHmVO56C540aRmwZKoftRB0ejkdLB6PhUGRXcBI2rbFdvKwuNKJqB0XIr8W_zcEo9AuMjBQqXkDqDUIaGn_ehKfw9c99kzw8cJNHx1EKxVL5Tc2QIYjXWnzTJAYscITCq6IiTTNSdfzWrkbK6Ys9ZOBYNqooaAOxHM5Urx7Cgg0jo2nWQ-tNyKSHfa9Ur7IxBkp137hW7Ar5pimJYb8Jd8oZGwB4uzNHV5V5yZs9aKCqXcaQoz0wgmT5FjT-zqcGz-JfMpGTeubgPg-tQjSvhwPB6mBaXWsOOyuyZPxNeFFDh51WEv53wQs_5fdTwGQ7rQ7ZTEfoBPZNA-JNfo3ecy54DQMmhflmL_IzGE__pNToBi02WlERFm0LclPXtKm4SsDXfTfMPWAve2W1wp-mP-bwB4PljC6NP98WLPWGizRw7g2NwQ_y0iWIogIq9ag
Host: someawesomeapp.appspot.com
Connection: Keep-Alive

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Cache-Control: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Vary: Accept-Encoding
Date: Sun, 13 Nov 2011 17:42:34 GMT
Server: Google Frontend
Transfer-Encoding: chunked

7
no user
0

Ответ от GAE - "No User". Есть мысли о том, как заставить GAE принять куки и действовать с ними как с пользователем?

27 секунд спустя, я думаю, что нашел проблему. Вот снифф из браузера, у меня нет этой части ACSID=.

Cookie: ACSID=AJKiYcFeUHZUP56a

Спасибо за помощь!
Stateful

EDIT: Я все исправил. Мне нужно подождать некоторое время, чтобы ответить на свой собственный вопрос, хотя, недостаточно репутации. В основном, поскольку я получаю куки с SSL, куки должны иметь префикс SACSID, а не ACSID, и url testuser должен быть https, поскольку это куки, которые мы используем.

6
задан Stateful 29 December 2011 в 19:08
поделиться