2011-11-13 24 views
6

Tôi đang chơi xung quanh với GAE và Android đang cố gắng tải ứng dụng được tạo cho một dịch vụ web. Tôi sẽ thực hiện các bước để lấy mã thông báo xác thực từ AccountManager trên Android, nhận Cookie theo yêu cầu, sau đó đính kèm cookie đó vào yêu cầu GET mà ứng dụng python GAE xử lý. Vì lý do nào đó, ứng dụng GAE dường như không nhận ra cookie, hoặc một cái gì đó. Xin lỗi vì bài đăng khổng lồ này, tôi nghĩ tôi sẽ nhận được nhiều mã ở đây nhất có thể để giúp giải thích.GAE không nhận ra cookie?

Tôi có lớp cơ bản này trong GAE để kiểm tra xem người dùng có được nhận dạng hay không.

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() 

Từ trình duyệt, điều này rất hữu ích. Tôi thấy người dùng. Khi thực hiện trên Android, tôi nhận được "không có người dùng".

Dưới đây là một loạt các mã 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); 
    } 

Lấy thẻ auth, vô hiệu hóa nó, và làm cho nó một lần nữa để tránh thẻ hết hạn:

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); 
    } 
} 

Lấy cookie của người dùng, được lưu trữ trong chuỗi cookie toàn cầu.

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(); 
} 

Chúng tôi giờ đây đã một cookie được lưu trữ, người dùng nhấn nút Kiểm tra tài khoản trong giao diện, điều này được thực hiện:

public void testuser (Xem xem) { 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(); 
    } 

}

Dưới đây là một sniff các kết nối từ 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 

Câu trả lời ở đây là "Không có người dùng" từ GAE. Bất kỳ suy nghĩ nào về cách để GAE chấp nhận và hành động trên cookie với tư cách là người dùng?

27 giây sau, tôi nghĩ rằng tôi đã tìm thấy sự cố. Đây là một sniff từ trình duyệt, tôi không có ACSID = một phần.

Cookie: ACSID=AJKiYcFeUHZUP56a 

Cảm ơn sự giúp đỡ của bạn!
Nhà nước

EDIT: Tôi đã khắc phục sự cố. Tôi cần phải chờ một lúc để trả lời câu hỏi của chính mình, không đủ danh tiếng. Về cơ bản, kể từ khi tôi nhận được cookie với SSL, cookie cần phải được bắt đầu bằng SACSID thay vì ACSID và url của người kiểm tra cũng cần phải là https vì đó là cookie chúng tôi đang sử dụng.

Trả lời

2

Tôi đã khắc phục sự cố. Đối với bất kỳ ai khác kéo tóc ra:

Khi bạn gửi yêu cầu nhận cookie bằng SSL, câu trả lời sẽ được bắt đầu bằng SACSID, nếu không nó sẽ là ACSID.

trên yêu cầu HTTP Tôi đã thay đổi việc bổ sung cookie:

httpget.setHeader("Cookie", "SACSID="+cookie); 

Và cũng có thể, vì đó là cookie S, tôi phải gửi yêu cầu qua SSL như vậy:

Các vấn đề liên quan