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.