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

Posted

技术标签:

【中文标题】Google+ 登录按钮 - 无法进行经过身份验证的呼叫【英文标题】:Google+ signin button - unable to make authenticated calls 【发布时间】:2013-02-22 21:39:27 【问题描述】:

我正在将新的 Google+ signin 按钮添加到我的应用程序中,但在进行经过身份验证的呼叫时遇到了一些问题。我已经包含了文档中描述的 htmljavascript,并且登录有效。我什至可以看到访问令牌。但是,当我向经过身份验证的端点发出请求时,我会收到“无效凭据”响应。例如我正在尝试:

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(就在之前):

(功能() var po = document.createElement('script'); po.type = '文本/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);

【问题讨论】:

您能否发布您正在使用的代码,包括登录按钮代码、登录回调和完整的 OAuth 请求代码?这将有助于我们调查您的问题。 【参考方案1】:

我对您的用例进行了复制,并将其记录在 this gist 中,它对我来说很好用。其他一些注意事项:

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

你应该使用 data-apppackagename 仅用于为有效的android应用程序提供包,否则您可能会在身份验证对话框中触发500错误。

【讨论】:

好的,谢谢你的帖子。我稍后会处理这个。 'data-apppackagename' 是一个有效的 Android 应用程序,所以我知道这不是问题所在。我将删除 user.profile 并查看是否可以将我带到某个地方。 仍然无法为我工作...我的代码与您的代码几乎相同,令牌随请求一起发送,但我仍然收到“无效凭据”【参考方案2】:

首先要检查的是确保您请求的是 gapi.client.oauth2.userinfo 正在寻找的范围。您可以请求附加范围作为按钮的一部分。

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

【讨论】:

根据 g+ 登录按钮文档,您不必手动设置令牌。我会检查这个。范围已在 g+ 登录按钮中请求。 请求中包含授权标头 我已尝试在即时模式下使用 gapi.auth.authorize,但仍然收到“无效凭据”响应。 如果包含 Authorization 标头,并且这与您返回的令牌相匹配,那么听起来很像是您缺少所需的范围。作为按钮的一部分,您要求什么范围?【参考方案3】:

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

1.在谷歌开发者控制台中注册为 webapplication 而不是安装的 application(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响应以获取对象中的信息。 在这里查看更多:Google Account login Integration for android Xamarin

【讨论】:

以上是关于Google+ 登录按钮 - 无法进行经过身份验证的呼叫的主要内容,如果未能解决你的问题,请参考以下文章

使用firebase google身份验证单击登录按钮时总是会自动登录,而没有选择以其他用户身份登录的选项

如果用户存在,则仅使用 Google Auth Provider 进行身份验证

错误:Google Drive嵌入视频无法为未经过身份验证的用户播放

Google Play 游戏无法在 Android 中进行身份验证

Google 身份验证不适用于 AngularFire2

如何使用 Node 服务器验证 Android Google 登录