36

私はかなり憤慨しています。JavaのGoogleAppEngineをサーバーとして使用して、Android向けのターンベースのマルチプレイヤーオンラインゲームを構築しようとしています。

彼らは完璧にフィットしているようです。AndroidにはGoogleアカウントが必要であり、GAEは認証にGoogleアカウントを使用しますが、無料でスケーラブルです。

そのため、休暇の前に、Android2.0の新しいAccountManagerAPIを使用して、AndroidクライアントからGAEアプリへの認証を取得することができました。次のコードを使用すると、ユーザーのGoogleアカウントのAuthTokenにアクセスし、それを認証に使用できるため、ユーザーはアカウントのユーザー名とパスワードを手動で入力する必要がありません。

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

その後、結果のAuthToken文字列を適切なURLに追加し、有効なCookieを取得して、それ以降のすべてのリクエストに使用できるようになりました。唯一のことは、先週いつかそれが私のために機能しなくなったということです。上記のコードからAuthTokenを使用しようとすると、Cookieが返されず、コードは欠落しているCookieに対してNullPointerExceptionをスローします。

以前の方法に戻ると、ユーザーがGoogleのユーザー名とパスワードを手動で入力していて、「https://www.google.com/accounts/ClientLogin」からAuthTokenを取得すると、問題なく機能します。

誰かがユーザーの電話のGoogleアカウントからAuthTokenを使用してGoogleAppEngineアプリ用のAndroidクライアントを構築したことを教えてください。また、これが機能しなくなった理由を教えてください。

本当にこの作品を作りたいです。私の代替案は、ユーザーに自分の資格情報を入力するように要求することです(これは不格好で、行う必要はありません)、またはサーバー用の別のソリューションを使用します。

前もって感謝します。

4

2 に答える 2

26

これについては、Googleのエンジニアから助けを得ました。authTokenの有効期限が切れていることがわかりました。私は当初、12月初旬(正確には9日)に実装を機能させていました。どうやらAccountManagerが行うことはauthTokenをキャッシュすることなので、私は12月9日から同じauthTokenを使用していました。私が休日から戻ったとき、それは期限切れでした。

この問題を解決するために、getAuthTokenを呼び出し、そのトークンでinvalidateAuthTokenを呼び出してから、getAuthTokenを再度呼び出します。これにより、有効なauthTokenが生成され、少し不格好で、AccountManagerが毎回新しいauthTokenを取得したり、キャッシュされたauthTokenの有効期限が切れているかどうかを確認したりする場合は不要ですが、正常に機能します。

トークンタイプとアカウントタイプを混同しないように注意してください。invalidateAuthTokenは「ah」ではなく「com.google」で呼び出す必要があります。そうしないと、サイレントに失敗します。

于 2010-01-07T15:23:52.630 に答える
4

それ自体は答えではありませんが、Androidv2.2.1を搭載したAndroidNexusで正しいトークンを取得するには、4行目の「ah」を「android」に置き換える必要がありました。他のデバイス/バージョンについてはよくわかりません。4行目は次のようになります。

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

の中へ :

... = mgr.getAuthToken(acct, "android", null, this, null, null);
于 2010-10-20T15:01:15.657 に答える