Google+登录按钮 - 无法进行经过身份验证的通话

时间:2013-03-07 15:44:10

标签: google-plus google-oauth

我正在将新的Google+ signin按钮添加到我的应用中,并且在进行经过身份验证的电话时出现问题。我已经包含了文档中描述的html和javascript以及signin的工作原理。我甚至可以看到访问令牌。但是,当我向经过身份验证的端点发出请求时,我收到“无效凭据”响应。例如,我正在尝试:

gapi.client.oauth2.userinfo.get()执行(函数(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']);
  }
}

请求userprofile:

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

3 个答案:

答案 0 :(得分:2)

我构建了一个用例的副本并将其记录在this gist中,它对我来说很好。其他一些说明:

  • 如果您请求plus.login,则不应请求userinfo.profile,因为它已包含在plus.login中,并会在授权对话框中创建重复的权限。您可以在文档的best practices部分找到更多相关信息。

  • 你应该使用 data-apppackagename仅提供有效Android应用程序的包,否则您可能会在auth对话框中触发500错误。

答案 1 :(得分:1)

要检查的第一件事是确保您正在请求gapi.client.oauth2.userinfo正在寻找的范围。您可以在按钮中请求其他范围。

在Chrome之类的网络控制台中查看是否有与请求一起传递的Authorized:标头以及它可能是什么。如果未发送或未定义,则可能尚未设置令牌本身,在这种情况下,您可能需要使用https://code.google.com/p/google-api-javascript-client/wiki/ReferenceDocs中记录的gapi.auth.setToken()设置身份验证令牌,或者只调用gapi .auth.authorize在立即模式下使用相同的范围,这应该确保它获得令牌。

答案 2 :(得分:0)

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

1.在Google开发者控制台中注册为webapplication而不是已安装的应用程序(android)*提供带有效网址的重定向网址(“http://abcd.com/xyz.aspx”)应在应用程序代码中使用。

2.在身份验证完成后,它将返回access_token

3.使用access_token发出REST请求以获取用户完整信息(https://www.googleapis.com/oauth2/v1/userinfo?access_token=“+ accessTokenValue +”。)

4.反序列化json响应以获取对象中的信息。 点击此处查看更多信息:Google Account login Integration for android Xamarin