AndroidでのGoogleによる認証とサーバー上のトークンの確認

最近、私はアンドロイドで個人的なプロジェクトを作成したかったのですが、主な質問は次のとおりでした。 もちろん、これはGoogleアカウントです。 ネットワークで多くの例を試してみました-ただし、APIは存在中に数回更新され、多くのメソッドが機能しませんでした。これについてのGoogle+に関する私の質問は、環境によってまったく受け入れられなかったか、「これをやったことがありません」

この記事では、初心者(私のような)ができるだけ簡単にAndroidでGoogleを認証し、トークンを受け取り、サーバーでこのトークンを確認する方法を説明します。



ちょっとした準備



開始するには、SDKにGoogle Play Servicesがインストールされている必要があります。 それらをインストールした後、必要なライブラリをすべてインポートできます。 この記事はAndroid Studioを想定して書かれています-彼自身が何をインポートする必要があるかを語っています。

ボタンを使用してアクティビティを作成しておく必要があります。

ユーザーにわかりやすくするために、標準のGoogle+ Sing-Inボタンを作成できます

次のようになります。

画像

レイアウトに追加するだけです:

<com.google.android.gms.common.SignInButton android:id="@+id/sign_in_button" android:layout_width="match_parent" android:layout_height="wrap_content"/>
      
      







ボタンにアクションを追加



私たちの活動を書きます:

 View btn = (View) findViewById(R.id.sign_in_button); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = AccountPicker.newChooseAccountIntent(null, null, new String[]{"com.google"}, false, null, null, null, null); startActivityForResult(intent, 123); } });
      
      





実際には、ボタンにアクションを割り当てます-アカウント選択を呼び出します。 Android Studioで作業している場合は、インポートする必要のあるライブラリを教えてくれるので、ここでは詳しく説明しません。

startActivityForResult(意図、123); -リターンが発生するコードを設定します。 123は戻りコードであり、何でもかまいません。 これは、複数の意図を実行する場合に必要であり、それらを異なる方法で処理する必要があります。



必要なアクセスエリア



クラスでこれらの変数を宣言します。 これらが必要なアクセス領域です。 1つ目はgoogleで記述されています。「認証されたユーザーを定義できます。 これを行うには、APIを呼び出すときに、Google +ユーザーIDの代わりにmeを指定する必要があります。 »ユーザーの個人データ(名前、姓、G +ページアドレス、アバター)を受信するために必要な2番目の許可、および電子メールを受信するための後者。 これはデータベースに書き込むための完全に変更されていない識別子であるため、私はこれが重要だと感じました。

  private final static String G_PLUS_SCOPE = "oauth2:https://www.googleapis.com/auth/plus.me"; private final static String USERINFO_SCOPE = "https://www.googleapis.com/auth/userinfo.profile"; private final static String EMAIL_SCOPE = "https://www.googleapis.com/auth/userinfo.email"; private final static String SCOPES = G_PLUS_SCOPE + " " + USERINFO_SCOPE + " " + EMAIL_SCOPE;
      
      







アプリケーションを登録します。



最初にこのアイテムを忘れました-修正されました。

code.google.com/apis/consoleにアクセスしてそこでプロジェクトを作成し、Credentialsに移動して、Installed Application-> Androidを選択してOAuthの新しいクライアントIDを作成する必要があります。 そこで、パッケージの名前とキーのSHA1量を入力する必要があります。

これにより、実際にはかなり残酷な方法で多くの問題を解決しました。

%USERPROFILE%\。Android \ debug.keystoreのdebug.keystoreがプロジェクトフォルダーに配置され、build.grandleに登録されました:



  signingConfigs { debug { storeFile file("debug.keystore") } myConfig { storeFile file("debug.keystore") storePassword "android" keyAlias "androiddebugkey" keyPassword "android" } }
      
      





その後、コマンドを実行する必要があります。

keytool -exportcert -alias androiddebugkey -keystore〜/ .android / debug.keystore -v -list

Keytool自体はSDKにあります。 出力から、SHA1を目的のフィールドにコピーします。

私が理解しているように、このメソッドは一時的なものであり、通常の操作では通常のキーを作成する必要があります。 しかし、テストにはこれで十分です。



トークン受信コード



 protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { if (requestCode == 123 && resultCode == RESULT_OK) { final String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME); AsyncTask<Void, Void, String> getToken = new AsyncTask<Void, Void, String>() { @Override protected String doInBackground(Void... params) { try { String token = GoogleAuthUtil.getToken(AcrivityName.this, accountName, SCOPES); return token; } catch (UserRecoverableAuthException userAuthEx) { startActivityForResult(userAuthEx.getIntent(), 123); } catch (IOException ioEx) { Log.d(TAG, "IOException"); } catch (GoogleAuthException fatalAuthEx) { Log.d(TAG, "Fatal Authorization Exception" + fatalAuthEx.getLocalizedMessage()); } return token; } @Override protected void onPostExecute(String token) { reg(token); } }; getToken.execute(null, null, null); } }
      
      





123は以前に指定したコードです。AcrivityNameはアクティビティの名前です。 大まかに言えば、必要なトークンのアクセス許可とアカウント名をトークン受信機能に渡します。 そして注意-これはすべてバックグラウンドで行われ、その後、受信したトークンは私が書いたreg関数に転送されます。 彼女はすでにトークンと必要なすべてのデータをサーバーに送信しています。

私は最近、例外を除いて開発しているので、提案がある場合、個人的なメッセージまたはコメントを書いてください。



サーバー上のトークンを確認してください。 (Php)



注目したいのですが、受け取ったトークンのタイプはオンラインです。 そして彼はたった10分で行動します。 オフライントークンを取得するには(そこからサーバーでより長く作業するため)、この手順を参照してくださいdeveloper.google.com/accounts/docs/CrossClientAuth

 $mToken = $_POST['plusToken']; $userinfo = 'https://www.googleapis.com/oauth2/v1/userinfo?alt=json&access_token=' . $mToken; $json = file_get_contents($userinfo); $userInfoArray = json_decode($json,true); $googleEmail = $userInfoArray['email']; $tokenUserId = $userInfoArray['user_id'];
      
      





実際にgoogleapisでトークンをフィードし、受信したJSON応答を取得します。



おわりに



おそらく、コードは未加工であり、かなり曲がって書かれています。 ただし、有効な解決策を見つけるために1週間殺しました。 ここでこのソリューションを見つけました: android-developers.blogspot.ru/2012/09/google-play-services-and-oauth-identity.html 、完全には機能していませんでしたが、この記事に多くが追加されました。

PMまたはコメントで記事を改善するための提案を聞く準備ができています。 初心者のために時間を節約したいと考えています。



All Articles