Authentication 无法将Google帐户链接到KeyClope中的Facebook帐户和viceversa

Authentication 无法将Google帐户链接到KeyClope中的Facebook帐户和viceversa,authentication,oauth-2.0,keycloak,facebook-login,google-login,Authentication,Oauth 2.0,Keycloak,Facebook Login,Google Login,我正在学习关于OAuth2和Spring安全性的教程,并配置了一个简单的SpringMVC应用程序。登录部分被外部化为一个单独的解决方案,称为keydove。在提出问题之前,我想提供一点背景知识,以便更好地理解我的问题 上下文 在keydepot内部,有一个称为CryptoPortfolio的领域和一个称为CryptoPortfolio的客户端。客户端是机密的,并且具有openid连接协议。我配置了两个指向Spring应用程序的重定向链接: http://localhost:8080/login

我正在学习关于OAuth2和Spring安全性的教程,并配置了一个简单的SpringMVC应用程序。登录部分被外部化为一个单独的解决方案,称为keydove。在提出问题之前,我想提供一点背景知识,以便更好地理解我的问题

上下文
在keydepot内部,有一个称为
CryptoPortfolio
的领域和一个称为
CryptoPortfolio
的客户端。客户端是机密的,并且具有openid连接协议。我配置了两个指向Spring应用程序的重定向链接: http://localhost:8080/login/oauth2/code/crypto-公文包-用于登录
http://localhost:8080/ -申请注销

通过
application.yaml
文件建立本地keydepot和本地应用程序之间的链接:

安全性:
oauth2:
客户:
注册:
加密组合:
客户id:加密投资组合
客户机密:25990e05-e846-41c0-9159-ce2a10a78102
客户端名称:加密端口
重定向uri:http://localhost:8080/login/oauth2/code/crypto-投资组合
授权授予类型:授权\ U代码
范围:openid
提供者:密钥斗篷
供应商:
钥匙斗篷:
发卡机构uri:http://localhost:8081/auth/realms/CryptoPortfolio
扩展
websecurityConfigureAdapter
的配置类非常简单:

@配置
公共类安全配置扩展了WebSecurity配置适配器{
私有最终身份验证SuccessHandler Impl authenticationSuccessHandler;
专用最终ClientRegistrationRepository ClientRegistrationRepository;
公共安全配置(AuthenticationSuccessHandlerImpl authenticationSuccessHandler,
ClientRegistrationRepository ClientRegistrationRepository){
this.authenticationSuccessHandler=authenticationSuccessHandler;
this.clientRegistrationRepository=clientRegistrationRepository;
}
@凌驾
受保护的无效配置(HttpSecurity http)引发异常{
http.authorizeRequests()
.anyRequest().authenticated();
http.oauth2Login()
//配置为OAuth2AuthorizationRequestRedirectFilter的登录重定向链接需要它
.loginPage(“/oauth2/authorization/crypto portfolio”)
.successHandler(authenticationSuccessHandler)
.及()
.logout()
.logoutSuccessHandler(oidcLogoutSuccessHandler());
}
@凌驾
public void configure(WebSecurity web)引发异常{
忽略();
}
@豆子
公共密码编码器PasswordEncoder(){
返回PasswordEncoderFactorys.createDelegatingPasswordEncoder();
}
私有OIDClientificatedLogoutSuccessHandler OIDClougutSuccessHandler(){
最终OIDClientiatedLogoutSuccessHandler logoutHandler=
新的OIDClientificationdLogoutSuccessHandler(clientRegistrationRepository);
logoutHandler.setPostLogoutRedirectUri(“http://localhost:8080/");
返回logoutHandler;
}
}
如果新用户不存在,验证成功处理程序将创建新用户,并向根页面发送重定向:

@组件
公共类AuthenticationSuccessHandlerImpl实现AuthenticationSuccessHandler{
私人最终组合查询服务组合查询服务;
私有最终用户注册服务用户注册服务;
公共身份验证SuccessHandlerImpl(PortfolioQueryService PortfolioQueryService,
用户注册服务用户注册服务){
this.portfolioQueryService=portfolioQueryService;
this.userRegistrationService=userRegistrationService;
}
@凌驾
AuthenticationSuccess(HttpServletRequest请求、HttpServletResponse响应、,
身份验证)引发IOException、ServletException{
if(portfolioQueryService.getPortfolioPositions(authentication.getName()).isEmpty()){
OidcUser主体=(OidcUser)身份验证。getPrincipal();
UserRegistrationRequest UserRegistrationRequest=新的UserRegistrationRequest();
userRegistrationRequest.setFirstName(principal.getGivenName());
userRegistrationRequest.setLastName(principal.getFamilyName());
userRegistrationRequest.setEmail(principal.getEmail());
userRegistrationRequest.setUsername(principal.getSubject());
userRegistrationService.registerNewUser(userRegistrationRequest);
}
响应。发送重定向(“/portfolio”);
}
我已经配置了两个提供商,Facebook和Google,并在Keycloack中填写了它们的客户端ID和机密。我已经将重定向URI添加到Google中的Keycloack中:http://localhost:8081/auth/realms/CryptoPortfolio/broker/google/endpoint 对于Facebook,我没有这样做,因为它自动接受所有本地主机端点

问题 我成功登录Facebook,创建了一个新用户。我也可以注销并重新登录Facebook。但如果我使用Facebook登录,并尝试使用其他社交帐户(如谷歌)登录,KeyClope登录页面会告诉我:

如果我单击第一个选项,它会将我重定向到一个只能更新基本信息的页面,当我单击“提交”时,它会再次将我重定向到同一页面:

如果我点击第二个选项,它会再次将我重定向到第一页。因为我没有密码,所以我不能以传统方式登录。

剩下的唯一选择是谷歌,我观察到,为了将现有的谷歌账户与Facebook(或其他网站)链接起来