0

アプリに新しい Google+サインインボタンを追加していますが、認証された呼び出しを行う際に問題が発生しています。ドキュメントに記載されているようにhtmlとjavascriptを含め、サインインは機能します。アクセストークンも見れます。ただし、認証されたエンドポイントにリクエストを送信すると、「無効な資格情報」という応答が返されます。たとえば、私はしようとしています:

gapi.client.oauth2.userinfo.get().execute(function(resp){console.log(resp);});

通常の Google oauth メソッド ( gapi.auth.authorize()) を使用すれば、この呼び出しを行うことができます。ここで何が起こっているのですか?私は何を間違っていますか?

google+ ボタンで userinfo.email と userinfo.profile スコープをリクエストしています。

G+ ログインの HTML:

<span id="signinButton">
<span
 class="g-signin"
 data-callback="signinCallback"
 data-apppackagename="com.mypackage" 
 data-clientid="myclientID"
 data-cookiepolicy="single_host_origin"
 data-requestvisibleactions="http://schemas.google.com/AddActivity"
 data-scope="https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/devstorage.read_only https://www.googleapis.com/auth/plus.login">

G+ サインイン ボタン用に含まれる js (直前):

(function() { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://apis.google.com/js/ client:plusone.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); })();

G+ ボタンのコールバック:

function signinCallback(authResult) {
  if (authResult['access_token']) { 
    signin();
  } else if (authResult['error']) {
     console.log('There was an error: ' + authResult['error']);
  }
}

ユーザープロフィールのリクエスト:

gapi.client.oauth2.userinfo.get().execute(function(resp) {console.log(resp);});

リクエストには、トークンを含む Authorization ヘッダーが含まれています(chrome dev ツールで確認できます)。

アップデート:

また、即時モードで gapi.auth.authorize() を使用しようとしました。これは機能せず、null 応答を返しました。即時モードを false に設定してこれを実行すると、認証プロンプトが表示されました (再度、g+ ボタンで認証した後)。この後、承認された呼び出しが機能しました。以下は私のコードです:

gapi.auth.authorize({client_id: 'myClientID', scope: 'https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/devstorage.read_only',
                immediate: mode, response_type: 'token id_token'}, callback);
4

3 に答える 3

2

私はあなたのユースケースの再現を作成し、それをこの要点に文書化しました。それは私にとってはうまくいきます。その他の注意事項:

  • をリクエストする場合、リクエストplus.loginしないでください。userinfo.profileこれは の一部として含まれてplus.loginおり、承認ダイアログで重複した権限が作成されるためです。詳細については、ドキュメントのベスト プラクティスセクションを参照してください。

  • data-apppackagename有効な Android アプリケーションのパッケージを提供する場合にのみ使用 してください。そうしないと、認証ダイアログで 500 エラーが発生する可能性があります。

于 2013-03-08T02:31:25.300 に答える
1

最初に確認することは、gapi.client.oauth2.userinfo が探しているスコープをリクエストしていることを確認することです。ボタンの一部として、追加のスコープをリクエストできます。

Chrome などでネットワーク コンソールを使用して、Authorized: ヘッダーがリクエストと共に渡されているかどうか、およびそのヘッダーが何であるかを確認します。送信されていないか未定義の場合、トークン自体が設定されていない可能性があります。その場合、 https: //code.google.com に記載されているように、gapi.auth.setToken() を使用して認証トークンを設定する必要があります。 /p/google-api-javascript-client/wiki/ReferenceDocsまたは、同じスコープで即時モードで gapi.auth.authorize を呼び出すだけで、トークンを確実に取得できます。

于 2013-03-07T16:11:31.473 に答える
0

Android xamarin で OAuth2Authenticator を使用して Google 認証を行いました。手順が役立つ場合があります。

1.インストールされたアプリケーション(Android)の代わりにWebアプリケーションとしてGoogle開発者コンソールに登録します*有効なURL(「http://abcd.com/xyz.aspx」)を含むリダイレクトURLを提供します。同じものをアプリケーションコードで使用する必要があります。

2.認証が完了すると、access_tokenが返されます

3. access_token を使用して REST リクエストを作成し、ユーザーの完全な情報を取得します ( https://www.googleapis.com/oauth2/v1/userinfo?access_token= " + accessTokenValue + ".)

4.json レスポンスをデシリアライズして、オブジェクトの情報を取得します。ここで詳細を確認してください:Android XamarinのGoogleアカウントログイン統合

于 2014-09-10T13:30:04.687 に答える