2010-01-03 5 views
37

Tôi khá bực mình. Tôi đang cố gắng xây dựng trò chơi trực tuyến nhiều người chơi theo lượt cho Android bằng cách sử dụng Máy ứng dụng của Google trong Java làm máy chủ.AuthToken từ Trình quản lý tài khoản trong ứng dụng khách Android Không còn hoạt động

Chúng có vẻ hoàn toàn phù hợp. Android yêu cầu tài khoản Google và GAE sử dụng tài khoản Google để xác thực, đồng thời miễn phí và có thể mở rộng.

Vì vậy, trước ngày lễ, tôi có thể nhận được xác thực cho ứng dụng GAE từ ứng dụng Android của mình bằng API quản lý tài khoản mới trong Android 2.0. Các mã sau đây cho phép bạn truy cập vào authToken của tài khoản Google của người dùng và sau đó sử dụng nó để xác thực, do đó người dùng không cần phải tự nhập tên tài khoản tài khoản và mật khẩu của họ:

AccountManager mgr = AccountManager.get(this); 
    Account[] accts = mgr.getAccountsByType("com.google"); 
    Account acct = accts[0]; 
    AccountManagerFuture<Bundle> accountManagerFuture = mgr.getAuthToken(acct, "ah", null, this, null, null); 
    Bundle authTokenBundle = accountManagerFuture.getResult(); 
    String authToken = authTokenBundle.get(AccountManager.KEY_AUTHTOKEN).toString(); 

tôi sau đó có thể nối thêm chuỗi kết quả AuthToken đến URL thích hợp và nhận được một cookie hợp lệ mà sau đó tôi có thể sử dụng cho tất cả các yêu cầu tiếp theo. Chỉ có điều là, đôi khi tuần trước nó chỉ dừng lại làm việc cho tôi. Bây giờ khi tôi cố gắng sử dụng AuthToken từ mã trên, tôi không nhận được một cookie trả về và mã của tôi ném một NullPointerException cho cookie bị thiếu.

Khi tôi quay trở lại cách cũ, khi người dùng đã nhập tên người dùng và mật khẩu Google của họ theo cách thủ công và tôi nhận được AuthToken từ "https://www.google.com/accounts/ClientLogin", nó hoạt động tốt.

Vui lòng cho tôi biết ai đó đã xây dựng ứng dụng khách Android cho ứng dụng Google App Engine bằng cách sử dụng AuthToken từ tài khoản Google trên điện thoại của người dùng và cung cấp cho tôi một số đầu mối về lý do khiến điều này không còn hoạt động nữa.

Tôi thực sự muốn thực hiện công việc này. Lựa chọn thay thế của tôi là yêu cầu người dùng nhập thông tin đăng nhập của họ (điều này rất khó khăn và họ không cần phải thực hiện) hoặc đi với giải pháp khác cho máy chủ.

Xin cảm ơn trước.

+0

Chúng ta có thể kiểm tra điều này trên một giả lập chạy API của Google? – Gopinath

+1

Đối với những người tự hỏi "URL thích hợp" là gì và cách "nhận một cookie hợp lệ", nó được đề cập gọn gàng trong [bài đăng trên blog này] (http: //blog.notdot.net/2010/05/Authenticating-chống-App-Engine-từ-một-Android-ứng dụng), mà cũng bao gồm vô hiệu hóa authToken – thomas88wp

Trả lời

26

Được trợ giúp về điều này từ kỹ sư của Google. Hóa ra authToken của tôi đã hết hạn. Ban đầu tôi đã bắt đầu thực hiện công việc vào đầu tháng 12 (chính xác là ngày 9). Rõ ràng những gì AccountManager làm là cache authToken, vì vậy tôi đã sử dụng cùng một authToken từ ngày 9 tháng 12. Khi tôi trở về từ những ngày nghỉ, nó đã hết hạn.

Để giải quyết vấn đề, bây giờ tôi gọi getAuthToken, sau đó gọi invalidateAuthToken trên mã thông báo đó, sau đó gọi lại getAuthToken. Điều này tạo ra một authToken hợp lệ và hoạt động tốt, ngay cả khi nó hơi khó khăn và sẽ không cần thiết nếu AccountManager chỉ có một authToken mới mỗi lần, hoặc kiểm tra xem liệu bộ đệm đã hết hạn chưa.

Lưu ý rằng bạn không được trộn lẫn loại mã thông báo với loại tài khoản: invalidateAuthToken phải được gọi với "com.google" thay vì "ah" hoặc nó sẽ không hoạt động âm thầm.

+1

Tôi đã có cùng một vấn đề & invalidateAuthToken là chìa khóa. Bạn sẽ cần được cấp phép android.permission.MANAGE_ACCOUNTS. –

+4

Mẹo: Khi bạn gọi invalidateAuthToken, hãy đảm bảo bạn chuyển loại tài khoản ("com.google") và không phải loại mã thông báo ("sức khỏe"). Tôi đã mắc lỗi này và mất một lúc để theo dõi vì invalidateAuthToken không trả về lỗi nào. – Artem

+2

Không vi phạm, nhưng vui lòng xem hướng dẫn http://developer.android.com/reference/android/accounts/AccountManager.html#get(android.content.Context) – kellogs

4

không phải là câu trả lời, nhưng tôi phải thay thế "ah" bằng "android" trong dòng 4 để nhận mã thông báo chính xác trên android nexus với android v2.2.1. không chắc chắn về các thiết bị/phiên bản khác. dòng 4 sau đó chuyển từ:

... = mgr.getAuthToken(acct, "ah", null, this, null, null); 

thành:

... = mgr.getAuthToken(acct, "android", null, this, null, null); 
+0

Tôi gặp vấn đề tương tự với tên này http://groups.google.com/group/android-developers/browse_thread/thread/d66ff537b04ec9a8 và câu trả lời của bạn đã lưu tôi. Cảm ơn cảm ơn bạn! – atraudes

+0

Cũng có phản hồi này đối với vấn đề của ông ở đây để tham khảo thế hệ tương lai: http://groups.google.com/group/android-developers/browse_thread/thread/81d427905c5a54bb – atraudes