我正在将新的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);
答案 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