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);});

该请求包括带有令牌的授权标头(通过 chrome 开发工具查看)。

更新:

我也尝试在即时模式下使用 gapi.auth.authorize() 。这不起作用并返回了空响应。当我在立即模式设置为 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: 标头与请求一起传递以及它可能是什么。如果未发送或未定义,则可能尚未设置令牌本身,在这种情况下,您可能需要使用 gapi.auth.setToken() 设置身份验证令牌,如https://code.google.com中所述/p/google-api-javascript-client/wiki/ReferenceDocs或仅在具有相同范围的即时模式下调用 gapi.auth.authorize ,这应确保它获得令牌。

于 2013-03-07T16:11:31.473 回答
0

我已经通过在 android xamarin 中使用 OAuth2Authenticator 完成了谷歌身份验证。步骤可能对您有所帮助。

1.在谷歌开发者控制台中注册为webapplication而不是安装的应用程序(android)*提供具有有效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 回答