Androidのクライアントもはや作業中のAccountManagerから持つAuthToken
-
22-09-2019 - |
質問
私はかなり憤慨しています。私は、AndroidがサーバーとしてJavaではGoogle App Engineを使用するために、ターンベースのマルチプレイヤーオンラインゲームを構築しようとしています。
彼らはぴったりのように見えます。 AndroidのGoogleアカウントを必要とし、GAEは無料で、スケーラブルでありながら、認証のためのGoogleアカウントを使用します。
だから、休日前に、私は、Android 2.0で新しいのAccountManagerのAPIを使用して、私の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();
私は、適切なURLへの結果の持つAuthToken文字列を追加し、私はすべてのそれ以上の要求のために使用することができ、有効なクッキーを取得することができました。唯一のものは、いつか先週、それはちょうど私のために動作を停止し、です。私は上記のコードから持つAuthTokenを使用しようとする今、私はクッキーが返されませんし、私のコードは、不足しているクッキーのためNullPointerExceptionがスローます。
私は、ユーザーが手動で自分のGoogleユーザー名とパスワードを入力して古いやり方に戻って、私はから持つAuthTokenを取得すると「<のhref =」https://www.google.com/accounts/ClientLogin」 rel = "nofollowをnoreferrer"> https://www.google.com/accounts/ClientLogin を」、それはうまく動作します。
そこを教えてください誰かがユーザーの携帯電話にGoogleアカウントから持つAuthTokenを使用して、Google App EngineのアプリのAndroidのクライアントを構築し、そして私に、これはもはや作業ではない理由として、いくつかの手がかりを与えています。
私はこの仕事をしたいと本当に思います。私の選択肢は、自分の資格情報の入力をユーザーに要求するようにしている(不格好で、これを彼らは何をする必要はありません)、またはサーバーの他のソリューションと一緒に行くます。
事前に感謝します。
解決
Googleのエンジニアから、このためのガットのヘルプ。私のauthTokenの判明には有効期限が切れました。私は当初(第9回は、正確には)12月初旬に実装作業を得ていました。私は12月9日以来、同じauthTokenのを使用していたので、どうやら何のAccountManagerが行うことは、キャッシュauthTokenのです。私は休暇から戻ったときに有効期限が切れています。
問題を解決するために、私は今getAuthTokenを呼び出し、そのトークンにinvalidateAuthTokenを呼び出し、再度getAuthTokenを呼び出します。これは、有効なauthTokenのを生成し、それは少し不格好で、AccountManagerをしたばかりの新鮮なauthTokenのたびを得た、またはキャッシュされた1の有効期限が切れたかどうかを確認するためのチェックをした場合は不要だろうとしても、うまく動作します。
アカウントのタイプとトークンタイプを混同してはならないことに注意してください。invalidateAuthTokenではなく、「ああ」の「com.google」と呼ばれなければならないか、それは静かに失敗します。
他のヒント
ではないの答えは、それ自体が、私はアンドロイドv2.2.1とのアンドロイドネクサス1に「ああ」行4の「アンドロイド」を取得するための正しいトークンを置き換える必要がありました。ないでください他のデバイス/バージョンについて。 4行目は、その後からなります:
... = mgr.getAuthToken(acct, "ah", null, this, null, null);
に:
... = mgr.getAuthToken(acct, "android", null, this, null, null);