7

リモートサーバーと通信する Android アプリを作成しています。アプリのユーザーが自分の電話にある Google 資格情報を使用してサーバーにログインできるようにしたいと考えています。アプリ。たとえば、ユーザー (Android) の電話が "someguy@gmail.com" で構成されている場合、ユーザーがアプリをインストールして実行すると、"someguy@ としてサインインしますか?" というダイアログが表示されます。 gmail.com?」というメッセージが表示され、[OK] ボタンを押すと、Google 自体によって認証されているように、自分のメール アドレスが someguy@gmail.com であることを認識している ID がサーバー上に確立されます。

Google 独自の oauth2 ドキュメントを含む、これを行う方法に関する広く多様な部分的なレシピを見つけましたが、それをすべて実現する方法を理解していません。

AccountManager を使用して、特定の電話にある Google アカウントを特定する Android コードがあります。サインオンに使用する Google アカウントをユーザーに尋ねると、認証トークンが返されます。

その時点を過ぎると、私はほとんど車輪を回転させています。私が見たレシピは、次の形式の http get を実行する必要があるようです:

http://<myWebServer>.com/_ah/login?continue=<someUrlIChoose>&auth=<authToken>

... (a) appengine に固有のように見えるという点で不満があり、選択した任意のバックエンドでこれを自由に実行できるようにしたい。(b) 設定した appengine インスタンスである appengine を試してみるつまり、ログにクエリが表示されるようになりました (someUrlIChoose URL が何かで呼び出されることを望んでいました)... したがって、トークンの有効性を通知される機会はありません。

具体的な質問には次のようなものがあります。

  • 認証トークンをどうすればいいですか...それをサーバーに送信し、サーバーがGoogleに連絡して、指定されたアカウントのトークンの有効性を確認しますか? または、このトークンが有効であることをサーバーに通知するために、(プロセスのこの段階で) 既に Google サーバーから発信されているはずのバックチャネル通信がありますか? または、他の何か?
  • このプロセスは、(appengine だけでなく) どのバックエンドのコンテキストでも実行可能であると考えるのは正しいでしょうか?
  • (oauth1 などではなく) oauth2 を使用する必要がありますか? 私が読んだものはすべて、oauth2に対するGoogleのサポートが「実験的」であることを暗示しているようです...しかし、そのような主張が現在のものか古いものかは確認していません。たとえ最新の製品であっても、Google にはさまざまな製品を永続的な非最終的な形 (たとえば、永遠のベータ版) に保持してきた歴史があるため、これについて何を結論付ければよいかわかりません。
  • 他に関係あるもの...
4

2 に答える 2

2

このコードを使用するには、後で google-play-services_lib をインポートする必要があります。

import com.google.android.gms.auth.GoogleAuthUtil;
import com.google.android.gms.auth.UserRecoverableAuthException;

private void gmail_login() {

    dialog = ProgressDialog.show(LoginActivity.this, "", getString(R.string.login_loading), true);

    AsyncTask task = new AsyncTask() {
        @Override
        protected Object doInBackground(Object... params) {
              getAndUseAuthTokenBlocking();
            return null;
        }
     };
     task.execute((Void)null);
}


void getAndUseAuthTokenBlocking() {
   try
   {
      String AUTH_TOKEN_TYPE = "oauth2:https://www.googleapis.com/auth/plus.me https://www.googleapis.com/auth/userinfo.email";
      AccountManager accountManager = AccountManager.get(this);
      Account[] accounts = accountManager.getAccountsByType("com.google");

      String token = GoogleAuthUtil.getToken(this, accounts[0].name, AUTH_TOKEN_TYPE);
      //token here
   } 
   catch (UserRecoverableAuthException userAuthEx) {
       startActivityForResult(userAuthEx.getIntent(), MY_ACTIVITYS_AUTH_REQUEST_CODE);
   }catch (Exception e){
       DropErrorMsg.drop(this, handler, R.string.connection_error, R.string.error, dialog, false);
   }
}
于 2013-05-03T12:26:10.653 に答える
0

これはあなたが探しているものですか?

ほとんどの Android アプリには、データを保持して共有するために、ある種のサーバー側バックエンドがあります。最も基本的なゲームでさえ、プレイヤーのハイスコアを覚えておく必要があります。バックエンドを構築する際に解決しなければならない問題の 1 つは、バックエンド コードがどのアプリと通信しているか、またそれを使用しているユーザーをどのように認識するかということです。

クライアント アプリと通信するための HTTP エンドポイントがあると思いますが、サーバー側のコードは、誰がメッセージを送信しているかをどのように確認できるのでしょうか? 結局のところ、誰でもどこからでも HTTP POST リクエストを送信できます。ユーザーの身元を推測できる場合、ユーザーになりすますことができますか?

モバイル デバイスでユーザー名とパスワードを入力するよう人々に求めるのは、本当にユーザーフレンドリーではありません。特に、誰かがあなたのアプリをインストールし、インターネットを使用してあなたの身元を知る許可をアプリに与えた場合、彼らはもう邪魔されるべきではありません.

Android リリース 2.2 以降を実行する互換性のあるすべてのデバイスで利用できるようになった Google Play サービスは、Google アカウントの使用に基づいて、この問題に対する優れたソリューションを提供することが判明しました。

http://android-developers.blogspot.se/2013/01/verifying-back-end-calls-from-android.html

于 2013-05-02T21:59:39.700 に答える