2014-11-25 212 views
0

我在网页上实现了一个按钮“在Google+上登录”,除了我无法获取用户的电子邮件地址,一切正常。Google+登录,如何获取用户电子邮件

这里是我的HTML代码

<div id="signinButton"> 
    <span class="g-signin" 
    data-scope="https://www.googleapis.com/auth/plus.login" 
    data-clientid="{{ google.cid }}" 
    data-redirecturi="postmessage" 
    data-accesstype="offline" 
    data-cookiepolicy="single_host_origin" 
    data-callback="signInCallback"> 
    </span> 
</div> 

当此按钮,用户点击&接受我的申请分享他的数据,一码是AJAX发送到服务器。这是应该获取用户数据的服务器部分。

$code = $request->getContent(); 

$client = new Google_Client(); 
$client->setClientId('Google_Api_Code'); 
$client->setClientSecret('Google_Api_Secret'); 
$client->setRedirectUri('postmessage'); 
$client->setScopes('email', 'profile'); 
$client->authenticate($code); 
$oAuth = new Google_Service_Oauth2($client); 
$oAttr = $oAuth->userinfo->get(); 

return new Response(var_dump($oAttr)); 

这里是用户信息的的var_dump

对象 Google_Service_Oauth2_Userinfoplus)]
保护 'internal_gapi_mappings'= > 阵列 (大小= 3)
- 'familyName'= >字符串 'FAMILY_NAME' (长度= 11)
- '给定名称'= >字符串 'GIVEN_NAME' (长度= 10)
- 'verifiedEmail'= >串'verified_email' (长度= 14)
公共 '电子邮件'= >空
公共 'familyName'= >字符串> 'SomeFamilyName' (长度= 6)
公共 '性别'= >串 '男性' (长度= 4)
公共 '给定名称'= >字符串 'SomeFirstName' (长度= 4)
公共 'HD' = >空
公共的 'id'= >字符串 '1021714674404 ********' (长度= 21)
公共 '链接'= >字符串 'https://plus.google.com/1021714674404********' (长度= 45)
公共 '区域设置'= >串成 'en' (长度= 2)
公共 '姓名'= >字符串 'SomeFirstName SomeFamilyName' (长度= 11)
公共 '画面'= >串的“https://lh6.googleusercontent。COM/someUrl /” (长度= 92)
公共 'verifiedEmail'= >空
- 保护 'modelData'= >
---- 阵列 (大小= 2)
------ 'GIVEN_NAME'= >字符串 'SomeFirstName' (长度= 4)
------ 'FAMILY_NAME'= >字符串 'SomeFamilyName' (长度= 6)
- 保护 '处理'= >
---- 阵列 (大小= 0)
------

正如你可以看到,我的电子邮件地址是NULL,我真的需要至少获得电子邮件地址(famillyName和firstname,但我有这些)。

在beggining我用Google_Service_Plus对象,但我有同样的结果(电子邮件空),我发现这个线程(Google Apps SSO - First and Last Name with OAuth 2 without using Google+)目前的解决方案,但它仍然没有工作 我也发现这个线程(Using Google+ API for PHP -- Need to get the users email),但似乎现在将apiOauth2Service称为Google_Service_Oauth2,因此它基本相同。

奇怪的是,当我使用谷歌自己的例子(https://developers.google.com/apis-explorer/#p/plus/v1/plus.people.get),我尝试用我的用户ID得到我的电子邮件地址,它返回一个空数组(它解释了我的代码中的空值)。

200个OK

  • 隐藏标题 -

的Cache-Control:私人,最大年龄= 0,必重新验证,无转换 内容编码:gzip 内容 - 长度:23 内容类型:application/json;字符集= UTF-8 日期:星期一,2014年11月24日17时34分39秒GMT 的Etag: “RqKWnRU4WW46-6W3rWhLR9iFZQM/C5t5kUwLc-tXgfm2-1GGe31qPDs” 到期:星期一,2014年11月24日17时34分39秒GMT 服务器: GSE

{}

我也试过这个解决方案(Google Api get users Email Address),但它也不起作用。

但是,当我尝试使用我的Google帐户注册到此网站(https://www.airbnb.fr/)时,他们得到了我的电子邮件地址!所以这是可能的,我只是不知道如何。

在此先感谢您的帮助:)。

回答

1

所以我想通了,从哪里传来的错误。

在我的代码中,谷歌没有向我发送用户的电子邮件,因为我的应用程序未验证。由于这个认证问题,我只能访问用户的公共信息,而不能访问电子邮件。从这一行的HTML

data-redirecturi="postmessage" 

来到

此认证错误当值“PostMessage的”被用作REDIRECT_URI,你的应用程序将有“客人”的特权和谷歌不会抛出有关REDIRECT_URI任何错误参数。这个值只能在早期的开发中用来测试谷歌API和你的应用程序之间的通信。

这里是official documentation约REDIRECT_URI参数:

这个参数的值必须完全匹配出现在谷歌开发者控制台证书页面中的一个值(包括HTTP或HTTPS方案,案例和尾部斜杠)

但是,我无法使用谷歌JavaScript SDK如上所示的工作。 我使用了一个基本环节:

<a href="https://accounts.google.com/o/oauth2/auth?redirect_uri=http://www.example.com/googleplus/&response_type=code&client_id={{ google.cid }}&scope=https://www.googleapis.com/auth/plus.login+https://www.googleapis.com/auth/userinfo.email&access_type=offline" > 
    Connect with Google+ 
</a> 

oAuth Playground帮了我很多,以解决这个问题。

希望它会帮助别人:)

0

您需要设置HTML电子邮件太范围,更多信息email scopes

<div id="signinButton"> 
    <span class="g-signin" 
    data-scope="https://www.googleapis.com/auth/plus.login email" 
    ... 
    data-callback="signInCallback"> 
    </span> 
</div> 

或其他选项:

<div id="signinButton"> 
    <span class="g-signin" 
    data-scope="https://www.googleapis.com/auth/plus.login https://www.googleapis.com/auth/plus.profile.emails.read" 
    ... 
    data-callback="signInCallback"> 
    </span> 
</div> 
+0

不幸的是不断变化的范围,因为它来自于redirectUri不能解决问题 – 2014-12-01 10:03:09

相关问题