问题标签 [quarkus-oidc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
176 浏览

quarkus - quarkus.oidc.auth-server-url 用于测试和本地主机开发

我正在使用 Keycloak for OIDC (OpenID Connect) 开发 Quarkus 应用程序。在开发过程中,应用程序正在运行,localhost:8080而 Keycloak 也在本地运行,同时使用 Docker。

application.properties

这工作正常。

现在我想创建一些测试。 https://quarkus.io/guides/security-openid-connect#wiremock告诉我更新application.properties如下:

我的问题:我如何设置该值用于测试。我不想通过评论/取消评论来不断切换值。如果它是由配置文件决定的,使用什么配置文件?

0 投票
1 回答
104 浏览

java - 具有资源前提条件的 Quarkus 资源测试

编写组件/集成测试。将 Quarkus 2.0 与放心、quarkus-junit5-mockito 和 quarkus-test-security-oidc 一起使用

我想用 precondtion(创建)测试资源方法,因为我想测试 GET。

问题是调用单独工作正常,或者不会出现错误。

两个调用都以:预期的状态代码 <200> 但为 <403> 结束。

注入了资源,但是处理 cdi 很痛苦,尤其是当测试注释会处理这个问题时。

有任何想法吗?

0 投票
1 回答
180 浏览

quarkus - 如何诊断 Quarkus REST 服务 OIDC 错误(特别是 403 禁止)?

我正在尝试使用 OIDC 承载来保护 Quarkus (v 1.13.7) REST 服务。我正在关注他们的Using OpenID Connect to Protect Service Applications 指南,但我运气不佳。

每当我Authorization: Bearer {validAccessToken}在对受保护资源的请求的标头中包含(使用@RolesAllowed注释)时,我都会收到一个403 Forbidden带有空正文的响应。如果我省略此标头,我可以很好地访问未受保护的资源,但不出所料,我可以401 Unauthorized再次使用空主体来访问受保护的资源。

这是我使用的应用程序属性:

注意日志记录部分。尽管它被配置为记录所有内容,但当我收到 403 响应时,这就是它所打印的全部内容:

也许对某人,某处,上述信息很有用。对我来说,它们没有用。有趣的是,如果令牌已过期,我实际上会收到一条表明这一点的消息。

我应该如何在上帝的绿色地球(或您喜欢的任何神灵和行星属性)上诊断这个问题?

我已经尝试使用Quarkus 异常映射来尝试捕获问题并检查异常,但是无论我如何配置异常映射,它都不会被调用。根据quarkus git repo 上的 issue #8570

[...] 来映射身份验证失败和授权,那么您需要禁用主动身份验证,然后您可以为生成的 AuthenticationFailedException 使用异常映射器,因为它将从拦截器而不是在安全处理的早期生成。

所以我添加quarkus.http.auth.proactive=false到我的应用程序属性中,现在 Quarkus 返回一个500 Internal Error它说它不能调用getIdentity()我不知道什么线程,我应该注入这个身份或其他类似的东西。问题是,我并没有试图在任何地方获得这个身份(至少现在还没有),所以这个失败是在他们自己的内部代码中。因此我放弃了尝试使用异常映射。

编辑:我还应该提到 OIDC 信息(客户端 ID、网址等)是有效的。我在我的 Angular 应用程序中使用它们,它们工作得很好。

0 投票
0 回答
123 浏览

authentication - 将 OICD 授权代码流与 RESTful API 和 SPA 结合使用

我目前正在从事一个个人项目,该项目涉及一个 Quarkus REST API 作为后端,Keycloak 作为 OpenId Connect Provider 和一个 Vue 应用程序作为前端。我只是不知道如何使这三个组件在用户身份验证中很好地协同工作,同时保持适当的安全性。

根据OAuth 2.0 for Browser-Based Apps的 v8 草案,SPA 不应该是保留访问和(可能)刷新令牌的地方,因为在这种情况下它们很难安全地存储。这意味着,后端必须充当依赖方,启动 OIDC 授权代码流。然后我会在我的 SPA 中保留一个会话 cookie(我不想这样做,以保持 API 无状态),或者将令牌存储在 Secure、SameSite、HttpOnly cookie 中。这种方法是我想要完成的,到目前为止收效甚微。

原型实现

我的 Quarkus 应用程序使用该quarkus-oicd扩展。我理解它的方式,我必须将以下配置添加到 Quarkus' application.properties

application-type=web-app告诉 Quarkus 它负责启动授权代码流。另一种选择是service,在这种情况下,Quarkus 仅验证客户端发送到 API 的不记名令牌。

该 API 在端口 8081 上运行,仅公开一个示例资源:

这个简单的 Vue 组件是一个概念验证:

期望的结果

我原以为没有有效令牌的后端调用会被重定向到 Keycloak 的身份验证页面。然后,用户将输入他们的凭据,登录并使用身份验证代码重定向回 SPA。它再次调用 API。在反向通道上,Quarkus 将身份验证代码与令牌交换,并以 cookie 的形式将其转发给客户端。此 cookie 将用于对用户进行任何进一步的 API 调用的身份验证。

实际结果

当后端在没有有效令牌的情况下被调用时,它会按预期重定向到 Keycloak 的登录页面。但是,显然,根本没有办法从 JS 导航到重定向的 URL。提取规范指出“重定向(其状态或内部响应(如果有)状态为重定向状态的响应)不会暴露给 API。暴露重定向可能会泄漏通过跨站点脚本攻击无法获得的信息。” 获取请求中的redirect: 'manual'选项有点像红鲱鱼。它不符合人们的预期,当然也不允许我访问重定向 URL。

相反,浏览器透明地遵循重定向并尝试获取登录 URL。那根本行不通。它会导致 CORS 错误,因为 Keycloak 没有设置相关的标头(我想它不应该,因为这不是它应该如何工作的)。

我不知道如何从这里开始,但我认为答案对于更有经验的人来说是非常明显的。

作为结束语,我想补充一点,这种架构并不是一个非常明智的决策制定过程的结果。我选择它主要是因为:

  • Quarkus:Java 目前是我工作的主要语言
  • Keycloak:我想尝试一下适当的外部化 IAM 和 SSO 有一段时间了。这似乎是一个很好的机会。
  • Vue:我想要一些东西来训练我的 JS 技能,并且在我的简历上看起来不错。当前的任何一批热门 SPA 框架都符合要求。

因此,任何类似于“这是一个糟糕的设置,只是不要这样做,而是尝试 X”的答案肯定也是受欢迎的,尽管我仍然希望以自豪的方式解决这个难题。

0 投票
1 回答
52 浏览

vert.x - 正文中发送的 OpenID 访问令牌,放在标头中

我有一个遗留的 jax-rs 请求。我无法改变它。它的主体具有 OpenID 访问令牌。我想使用 quarkus-oidc 对其进行验证。我的想法是阅读正文并将令牌放入Authorization标题。

我尝试使用ContainerRequestFilter和不使用quarkus 主动身份验证,但看起来 quarkus 身份验证检查发生在 jax-rs 之前,在 vert.x 的某个地方

我找到了这个Quarkus 自定义授权拦截器,但它仅在访问令牌位于查询字符串中时才有效。

如何在 quarkus-oidc 检查访问令牌之前读取请求正文并在标头中写入访问令牌?

0 投票
1 回答
399 浏览

keycloak - 为什么 quarkus.oidc.credentials.secret 被忽略?

我有一个SPA (Vue.js),它通过REST 与 Quarkus Resource API进行通信。我正在使用自己的Keycloak 进行身份验证/授权

在 Keycloak 中,我的领域中有两个客户:

我的 Quarkus API 的 application.properties:

我的 SPA 使用标准流程向 Keycloak 进行身份验证,然后重定向到我的应用 ✅</p>

然后我可以向我的 API 发出请求,尽管 quarkus.oidc.client-id 和 quarkus.oidc.credentials.secret 被注释掉,但一切正常!这是为什么?当这些行没有被注释掉但具有错误值时,它也可以工作。

为什么 Quarkus 会忽略这些行,更重要的是,它为什么会起作用?

更新 添加依赖项

允许我将其添加到 application.properties:

它现在导致此错误:

但至少现在秘密没有被忽视,提供错误的秘密会导致正确的错误。

追问:为什么不允许bearer-only?

0 投票
1 回答
185 浏览

quarkus - Quarkus OIDC 重定向 uri 绝对路径

我有一个云负载balancer/virtual server/firewall位于一组 pod 前面Quarkus,几乎就像一个反向代理。流量通过该公共入口点进入并重新路由到内部网络。

我们正在使用 Azure B2C 登录应用程序,当您直接访问 pod 或内部负载均衡器时,这非常有效。

问题是,当使用外部负载均衡器时,重定向 uri 位于内部网络的上下文中,无法从公共端访问。

有没有办法将到我们外部服务器的重定向 uri 设置为绝对 uri 而不是相对的?文档很清楚它是相对的,但我没有看到任何将其重定向到自定义 uri 的方法。还是在安全方面这是一种完全错误的方法?我知道我可以尝试重新配置外部负载均衡器,但想要一种快速设置重定向 uri 的方法。我知道这在其他框架中是可能的。

这有效:

这也有效:

这不起作用:

(重定向 uri 是内部负载平衡器)

如果有帮助,请提供其他信息。我们正在使用身份验证代码流并quarkus-oidc自动将重定向 url 设置为相对路径。我不确定是否有办法将重定向 uri 覆盖到我们的外部负载均衡器而不是内部。

https://quarkus.io/guides/security-openid-connect-web-authentication#quarkus-oidc_quarkus.oidc.authentication.redirect-path

已解决:我必须配置 x-forwarded/reverse 代理来读取原始源:

https://quarkus.io/guides/security-openid-connect-web-authentication#external-and-internal-access-to-openid-connect-provider

0 投票
2 回答
49 浏览

quarkus - 是否有一个具有多个命名 OidcClients 的小 quarkus 项目来调用多个服务调用?

正在寻找具有多个 OidcClients 的示例 quarkus 响应式项目来进行多个服务调用?

例如:DemoProject 想要调用服务 A、B、C、D。DemoProject 使用了 keycloak 授权,授权类型为密码。服务A有OidcClientA,服务B有OidcClientB,服务C有OidcClientC,服务D有OidcClientD。我们如何简单地将 OidcClient 注入特定服务并自动获取特定令牌、授权标头到特定服务?

Quarkus 文档:https ://quarkus.io/guides/security-openid-connect-client

0 投票
0 回答
34 浏览

quarkus - oidc-client:grant.type=password 不支持其他授权选项

我刚刚开始使用 quarkus-oidc-client 从我们的 Ping-Identity 服务器获取令牌。

在 quarkus.oidc-client.grant.type=password 的情况下,不支持其他授权选项,因为在初始化 tokenGrantParams 时只考虑 password.username 和 password.password(请参阅https://github.com/quarkusio/quarkus/blob /main/extensions/oidc-client/runtime/src/main/java/io/quarkus/oidc/client/runtime/OidcClientRecorder.java#L154 )

我们的 Ping 身份服务器需要一个额外的授权选项(password.validator_id)。在授予密码的情况下,是否有计划支持其他授予选项?有什么解决方法吗?

谢谢托马斯

0 投票
1 回答
87 浏览

java - 允许 quarkus-oidc 自定义 403 的响应正文

我想在 quarkus oidc 应用程序中自定义 403/401 的响应体。我已经尝试了很多事情来实现它,但无法做到。同样可以在 Spring boot 中轻松实现。