0

Google Play サービスを使用して、Android アプリで Google 認証を機能させる際に問題が発生しています。まず、ライブラリで提供されているサンプルを使用して、以下のスコープを使用してトークンを取得しました

GoogleAuthUtil.getToken(getActivity(), mEmail,"oauth2:https://www.googleapis.com/auth/userinfo.profile");

次に、トークンを使用してユーザーに関する詳細情報を取得しました。

URL url = new URL("https://www.googleapis.com/oauth2/v1/userinfo?access_token=" + token);
HttpURLConnection con = (HttpURLConnection) url.openConnection();

それはうまくいきました。次に、Verifying Back-End Calls from Android Apps post on Google Developers Blog を使用して、Web サーバーに対してアプリ ユーザーを認証しました。だから私は getToken のスコープを

audience:server:client_id:<webapp_clientId_for_localhost>.apps.googleusercontent.com

また、この記事のチェッカーと同様のチェッカーを使用して、サーバー側でオーディエンスと clientId (Android クライアント ID) を確認しました。これも機能しましたが、ユーザーに関する詳細情報 (姓名) を Android アプリまたは Web アプリから取得しようとすると、userinfo API を使用して次のように取得します。

{ "error": { "errors": [ { "domain": "global", "reason": "authError", "message": "Invalid Credentials", "locationType": "header", "location": " Authorization" } ], "code": 401, "message": "Invalid Credentials" } }

私が使用するコードは次のとおりです。

URL url = new URL("https://www.googleapis.com/oauth2/v1/userinfo");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestProperty("Authorization", "OAuth " + token);
con.setRequestProperty("ContentType", "application/json; charset=UTF-8");

userinfoが機能しない理由は何ですか? スコープに追加する必要があるものは他にありますか?

4

1 に答える 1

3

バックエンド検証に使用するトークンはサーバー用であり、oauth2: を含むトークンは Google 用です。現時点では、両方のトークンを同時にリクエストするメカニズムがないため、GoogleAuthUtil を 2 回呼び出す必要があります。1 回の同意手順の後、両方 (一度に 1 つずつ) を要求できるはずです。実際には、oauth2: トークンが必要になる頻度は低くなります。これは、ユーザーのプロファイル データを、ホーム サーバーでユーザーから取得したアカウントに関連付けることができるためです。

于 2013-02-18T04:14:58.167 に答える