根据Facebook's official documentation,电子邮件访问权限授予用户接受的任何应用,并在使用Facebook登录时授予权限。
我已经仔细检查了我们的应用定义,我可以看到电子邮件应该是可访问的。
我正在使用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 ,除了我自己的用户。
有两种情况,即电子邮件可能为空
我通过访问我的朋友的帐户
进行了三次检查我转到GraphApi explorer但是没有回复电子邮件。
有什么建议吗?谢谢。
答案 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'的方法。所以在这里发布可能对其他人有帮助的解决方案。