使用OpenID Connect Gluu认证提供程序保护Spring Boot Web应用程序客户端

3
我遵循了这个指南 http://spring.io/guides/tutorials/spring-boot-oauth2 并且成功地使用Facebook和Github,但是我希望使用GLuu作为我的内部认证提供者来与我的Spring Boot Web应用程序进行OpenID Connect。我已将Gluu配置为返回两种响应类型:授权代码授予类型和ID令牌,并将认证方法设置为client_secret_basic。我不确定在Spring客户端Web应用程序方面需要做什么额外的配置,但我认为基于该指南,我可以进行最小的配置并只需设置

security.oauth2.client.client-id =

security.oauth2.client.client-secret =

security.oauth2.client.access-token-uri=https://mygluuServer/oxauth/seam/resource/restv1/oxauth/token

security.oauth2.client.user-authorization-uri=https://mygluuServer/oxauth/seam/resource/restv1/oxauth/authorize

security.oauth2.resource.user-info-uri=https://mygluuServer/oxauth/seam/resource/restv1/oxauth/userinfo

security.oauth2.client.scope=openid

当我导航到我的Spring Boot Web应用程序时,我被重定向到gluu进行认证,但认证后它没有提示我批准共享我的openid信息,而是将我重定向回Spring Boot应用程序并给出错误消息.. Authentication Failed:Could not obtain access token

有人成功地使用Gluu来保护使用OpenID Connect的Spring Boot Web应用程序吗?


在 Spring Boot 端将日志记录级别提高到跟踪级别后,我开始看到问题所在,但不确定如何解决。/oxauth/authorize 端点被调用时没有错误,Gluu 返回授权代码和会话 ID。问题出在 Spring 回调 oxauth/token 端点时... 这里是错误信息。 - emmmdeee
2016-01-14 12:20:31.339 DEBUG 6987 --- [nio-8443-exec-6] g.c.AuthorizationCodeAccessTokenProvider : 编码并发送表单:{grant_type=[authorization_code], code=[09140630-c1d1-42c4-a5fa-354609cad5ab], redirect_uri=[https://magellan:8443/login], client_id=[@!1565.489B.E582.E70F!0001!156A.784D!0008!922A.2F73], client_secret=[superSecret]} 2016-01-14 12:20:31.351 DEBUG 6987 --- [nio-8443-exec-6] uth2ClientAuthenticationProcessingFilter : 认证请求失败:org.springframework.security.authentication.BadCredentialsException: 无法获取访问令牌 - emmmdeee
如果我理解正确,在使用Gluu进行身份验证后,浏览器在第一次重定向后会获得一个cookie,因此浏览器已经通过Gluu进行了身份验证,但Spring Boot客户端没有。在通过Gluu进行身份验证后,Gluu将使用auth_code和session_id重定向回Spring Boot /login URL,然后Spring Boot将对/oxauth/token端点进行POST请求,但我认为它被阻止了,因为Spring Boot客户端尚未通过Gluu进行身份验证。/oxauth/token端点不应该对所有请求开放并且不需要身份验证吗? - emmmdeee
1个回答

3
我终于弄清楚了我的问题所在。由于Java不信任Gluu证书,因此BadCredentialsException掩盖了真正的错误,即Java不想通过安全连接与Gluu对话令牌端点。现在,当我将Gluu设置为client_secret_post身份验证模式,并且我的Spring Boot客户端使用以下属性时:security.oauth2.client.authentication-scheme=form和security.oauth2.client.client-authentication-scheme=form,一切都很顺利。我已经将Gluu证书导入到我的jvm的cacerts java keystore中。我想将它导入到truststore并在application.properties中指向它,但目前存在问题。

你好 @emmmdeee,我有一个类似的问题。我正在尝试使用Spring Boot和WSO2 Identity Server进行身份验证。 - Ignacio Ocampo
1
好的,那就相当含糊了。我想说的是,如果你遇到错误并且找不到根本原因,请尝试将你的Identity服务器配置为仅在http上工作(如果可能),然后在流程发生时使用wireshark监视流量。这可能会给你一些线索。如果你必须通过https运行,你可能绝对需要导出WSO2证书并将其导入你的Spring Boot应用程序正在运行的JVM的cacerts文件中。这是必需的,因为默认情况下,Java不会向它不信任证书的服务器发送成功的post请求。 - emmmdeee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接