java - principal.getName() 返回 facebook 的 ID 而不是名称

标签 java facebook-graph-api spring-boot single-sign-on spring-security-oauth2

我使用 spring-security-oauth 实现了自定义身份验证服务器以及多个用于单点登录的客户端应用程序,我可以选择 facebook 和 google 登录。

现在在我的客户端应用程序上,当我有这个 Controller 时:

    @RequestMapping({ "/user", "/me" })
public Principal user(Principal principal) {
    return principal;
}

对于 google,它工作正常并返回名称,但对于 facebook,它返回一个唯一的 ID。我尝试了很多方法,但无法从这个主要对象中获取名称。有人可以帮忙吗?

这是我的简短 Facebook 配置:

accessTokenUri: https://graph.facebook.com/oauth/access_token
userAuthorizationUri: https://www.facebook.com/dialog/oauth
tokenName: oauth_token
authenticationScheme: query
clientAuthenticationScheme: form
userInfoUri: https://graph.facebook.com/me?fields=id,name,email

最佳答案

好的,我已经解决了:

    @RequestMapping(value = { "/user", "/me"}, method = RequestMethod.GET)
public Map<String, String> user(Principal principal) {
    Map<String, Object> details = (Map<String, Object>) ((OAuth2Authentication) principal).getUserAuthentication().getDetails();
    Map<String, String> map = new LinkedHashMap<>();
    map.put("name", (String) details.get("name"));
    map.put("email", (String) details.get("email"));
    return map;
}

关于java - principal.getName() 返回 facebook 的 ID 而不是名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43968110/

相关文章:

Facebook API 速率限制 - 服务器端与客户端

java - spring security 已经给了token 是不是还要写一个代码把token 存到redis 中?

java - 如何在 MyBatis Insert 中使用 Mysql 触发器生成的值填充对象属性

java - 在 Android Service 和 Activity 之间保持 Messenger 的 Activity 状态

java - Interface Annotation 不接受 application.properties 值

facebook-graph-api - 我可以获得安装了我的 Tab 应用程序的主页列表吗?

facebook-graph-api - 如何使用 FB Graph Api (Instagram) 正确过滤嵌套查询?

spring - 升级到 Spring Boot 1.3 导致 java.lang.NoSuchMethodError : org. springframework.beans.factory.config.ConfigurableBeanFactory.getSingletonMutex()

java - 从 cmd 运行时 Spring Boot 加载测试数据库

java - 并发编程。使用机器人卡雷尔