使用 OpenID Connect Gluu 身份验证提供程序来保护 Spring Boot Web App 客户端

Posted

技术标签:

【中文标题】使用 OpenID Connect Gluu 身份验证提供程序来保护 Spring Boot Web App 客户端【英文标题】:Use OpenID Connect Gluu authentication provider to secure Spring Boot Web App client 【发布时间】:2016-04-18 19:08:39 【问题描述】:

我已遵循本指南http://spring.io/guides/tutorials/spring-boot-oauth2 并可以使其与 Facebook 和 Github 一起使用,但我想使用 GLuu 作为我的内部身份验证提供程序,以使用我的 Spring Boot Web 应用程序执行 OpenID Connect。我已将 Gluu 配置为返回两种响应类型 授权码授予类型和 ID Token 和我将身份验证方法设置为 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 应用程序并给我错误..身份验证失败:无法获取访问令牌

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

【问题讨论】:

在 Spring Boot 端将日志记录调高到跟踪级别后,我开始了解问题所在,但不知道如何解决。 /oxauth/authorize 端点被正确调用,Gluu 发回授权码和 session_ID。问题是当 Spring 回调 oxauth/token 端点时......这是错误 2016-01-14 12:20:31.339 DEBUG 6987 --- [nio-8443-exec-6] gcAuthorizationCodeAccessTokenProvider :编码和发送形式:grant_type=[authorization_code],code=[ 09140630-c1d1-42c4-a5fa-354609cad5ab], redirect_uri=[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 调试 6987 --- [nio-8443-exec-6] uth2ClientAuthenticationProcessingFilter:身份验证请求失败:org.springframework.security.authentication.BadCredentialsException:无法获取访问令牌 201 因此,如果我在第一次重定向浏览器后通过 Gluu 进行身份验证后理解正确,则浏览器将获得 Cookie,因此浏览器已通过 Gluu 身份验证,但 Spring Boot Client 不是。在对 Gluu 进行身份验证后,Gluu 使用 auth_code 和 session_id 重定向回 spring boot /login url,然后 spring boot 向 /oxauth/token 端点发布一个帖子,但我认为它被阻止了,因为 spring boot 客户端尚未对 Gluu 进行身份验证。 /oxauth/token 端点不应该对所有请求开放并且不需要身份验证吗? 【参考方案1】:

好吧,我终于弄清楚我的问题是什么了。由于某种原因,BadCredentialsException 掩盖了真正的错误,即 Java 不想通过与令牌端点的安全连接与 Gluu 对话,因为 java 不信任 Gluu 证书。在 client_secret_post 身份验证模式下使用 Gluu,而我的 Spring Boot 客户端使用属性

security.oauth2.client.authentication-scheme=form

security.oauth2.client.client-authentication-scheme=form

现在一切正常,因为我已将 Gluu 证书导入我的 jvm 的 cacerts java 密钥库。我想将它导入到信任库并用我的 application.properties 指向它,但目前遇到了问题。

【讨论】:

你好@emmmdeee,我也有类似的问题。我正在尝试使用 Spring Boot 和 WSO2 Identity Server 进行身份验证 好吧,这很模糊。我会说,如果您遇到错误并且您无法找出根本原因,请尝试将您的身份服务器配置为仅在 http 上工作(如果它允许您的话)然后在流程发生时观察wireshark 中的流量.它可能会给你一个线索。如果您必须通过 https 运行,您可能肯定需要导出 WSO2 证书并将其导入到运行 Spring Boot 应用程序的 JVM 的 cacerts 文件中。这是必需的,因为默认情况下 Java 不会向它不信任证书的服务器发出成功的 post 请求。

以上是关于使用 OpenID Connect Gluu 身份验证提供程序来保护 Spring Boot Web App 客户端的主要内容,如果未能解决你的问题,请参考以下文章

使用 jumbojett/OpenID-Connect-PHP 库的 KeyCloak 身份验证流程

OpenId Connect 身份验证属性

使用 OpenId Connect 进行基于声明的身份验证

IdentityServer4 使用OpenID Connect添加用户身份验证

使用 Azure b2c OpenID Connect 配置 Ckan 的身份验证

.Net Core 2 OpenID Connect 身份验证和多个身份