用户的电子邮件始终为NULL - Spring Social Facebook登录

时间:2016-03-16 15:41:38

标签: spring facebook email facebook-graph-api

根据Facebook's official documentation,电子邮件访问权限授予用户接受的任何应用,并在使用Facebook登录时授予权限。

我已经仔细检查了我们的应用定义,我可以看到电子邮件应该是可访问的。

enter image description here

我正在使用Spring Social提供的最新版本

<spring-social-security>1.1.4.RELEASE</spring-social-security>
<spring-social-core>1.1.4.RELEASE</spring-social-core>
<spring-social-facebook>2.0.3.RELEASE</spring-social-facebook>

用户使用Facebook作为提供商以及Google+和Twitter成功登录。

不幸的是,对于所有情况,电子邮件都是NULL ,除了我自己的用户。

有两种情况,即电子邮件可能为空

  • 如果有人使用电话号码而不是电子邮件地址注册Facebook,则电子邮件字段可能为空
  • 如果没有有效的电子邮件地址,则不会返回此字段

我通过访问我的朋友的帐户

进行了三次检查
  1. 已经验证了有效的电子邮件
  2. 它有一个与之关联的电话号码
  3. 我们是彼此的朋友
  4. 他的朋友可以看到他的电话和电子邮件
  5. 我转到GraphApi explorer但是没有回复电子邮件。

    有什么建议吗?谢谢。

3 个答案:

答案 0 :(得分:6)

我发现了问题所在。我没有将所需的范围添加到社交连接工厂。

FacebookConnectionFactory fcf = new FacebookConnectionFactory(
            env.getProperty("oauth.facebook.api.key"),
            env.getProperty("oauth.facebook.api.secret"));
   //this is the important bit 
   fcf.setScope("public_profile,email");

   .....

电子邮件缺失。

答案 1 :(得分:1)

也许问题是你试图获取用户名。目前,Facebook摆脱了用户名,因为用户名是通过Facebook发送电子邮件的一种方式。

您可以尝试删除此行:

final String uemail = userProfile.getUsername();

并检查您是否可以收到电子邮件。 这是我用来获取电子邮件等的代码:

OAuth2Operations oauthOperations = fbProvider.getOAuthOperations();
AccessGrant accessGrant = oauthOperations.exchangeForAccess(authorizationCode, facebookCallback, null);
String accessToken = accessGrant.getAccessToken();

Connection<Facebook> connection = fbConnectionFactory.createConnection(accessGrant);

UserProfile profile = connection.fetchUserProfile();
ConnectionKey connectionKey = connection.getKey();
String usn = connectionKey.getProviderUserId();
String email = profile.getEmail();

答案 2 :(得分:0)

正如@felipe所提到的,它需要设置权限/范围以在facebook登录时获取电子邮件。

如果您使用XML格式而不是使用java类进行配置,那么您可以将范围定义为以下范围。

 <bean id="connectionFactoryRegistry"
              class="org.springframework.social.security.SocialAuthenticationServiceRegistry">
            <property name="authenticationServices">
                <util:list>
                    <bean class="org.springframework.social.facebook.security.FacebookAuthenticationService">
                        <constructor-arg value="${facebook.clientId}"/>
                        <constructor-arg value="${facebook.clientSecret}"/>
                        <property name="defaultScope" value="email"/>
                    </bean>
                </util:list>
            </property>
        </bean>
        <alias name="connectionFactoryRegistry" alias="connectionFactoryLocator"/>

我花了几个小时来找到一种通过XML配置设置'scope'的方法。所以在这里发布可能对其他人有帮助的解决方案。

参考: - https://github.com/timeu/GWA-Portal/blob/c4fffb0cc4aeb295d9eef7c642c7a25090560014/genophenbrowser-server/src/main/resources/META-INF/spring-social.xml