更新:2018 年 5 月 15 日
正如您已经找到解决方案一样,问题发生的原因是JSESSIONID
被覆盖
更新:2018 年 5 月 10 日
好吧,你对第三个赏金的坚持终于得到了回报。我开始深入研究存储库中两个示例之间的不同之处
如果你看一下manual
回购协议和/user
mapping
@RequestMapping("/user")
public Principal user(Principal principal) {
return principal;
}
正如你所看到的,你正在返回principal
在这里,您可以从同一对象获得更多详细信息。现在在您运行的代码中auth-server
folder
@RequestMapping({ "/user", "/me" })
public Map<String, String> user(Principal principal) {
Map<String, String> map = new LinkedHashMap<>();
map.put("name", principal.getName());
return map;
}
如您所见,您只返回了name
in the /user
映射和您的 UI 逻辑在下面运行
$.get("/user", function(data) {
$("#user").html(data.userAuthentication.details.name);
$(".unauthenticated").hide();
$(".authenticated").show();
});
所以返回的 json 响应/user
api预计有userAuthentication.details.name
UI 没有该详细信息。现在,如果我在同一个项目中更新如下方法
@RequestMapping({"/user", "/me"})
public Map<String, Object> user(Principal principal) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("name", principal.getName());
OAuth2Authentication user = (OAuth2Authentication) principal;
map.put("userAuthentication", new HashMap<String, Object>(){{
put("details", user.getUserAuthentication().getDetails());
}});
return map;
}
然后检查应用程序,它可以工作
原答案
所以问题是您从存储库运行了错误的项目。您正在运行的项目是auth-server
这是为了启动你自己的oauth
服务器。你需要运行的项目就在里面manual
folder.
现在如果你看下面的代码
OAuth2ClientAuthenticationProcessingFilter facebookFilter = new OAuth2ClientAuthenticationProcessingFilter(
"/login/facebook");
OAuth2RestTemplate facebookTemplate = new OAuth2RestTemplate(facebook(), oauth2ClientContext);
facebookFilter.setRestTemplate(facebookTemplate);
UserInfoTokenServices tokenServices = new UserInfoTokenServices(facebookResource().getUserInfoUri(),
facebook().getClientId());
tokenServices.setRestTemplate(facebookTemplate);
facebookFilter.setTokenServices(
new UserInfoTokenServices(facebookResource().getUserInfoUri(), facebook().getClientId()));
return facebookFilter;
你运行的实际代码有
private Filter ssoFilter(ClientResources client, String path) {
OAuth2ClientAuthenticationProcessingFilter filter = new OAuth2ClientAuthenticationProcessingFilter(
path);
OAuth2RestTemplate template = new OAuth2RestTemplate(client.getClient(), oauth2ClientContext);
filter.setRestTemplate(template);
UserInfoTokenServices tokenServices = new UserInfoTokenServices(
client.getResource().getUserInfoUri(), client.getClient().getClientId());
tokenServices.setRestTemplate(template);
filter.setTokenServices(tokenServices);
return filter;
}
在你当前的userdetails
来自facebook
没有被收集。这就是您看到错误的原因
因为当您登录用户时,您没有收集其用户详细信息。因此,当您访问详细信息时,它不在那里。因此你会得到一个错误
如果你运行正确manual
文件夹,可以用了