使用 Okta 验证其余端点和 UI

Authenticating rest endpoints and the UI using Okta

我们有一个 Java 8 后端应用程序,使用带有嵌入式 Jetty 服务器的 SprintBoot。

应用程序的 UI 是使用 React 构建的单页应用程序。

目前,我已经通过使用 spring 安全 SAML 扩展与 Okta 集成来启用身份验证。当 Okta 将断言发布到我的应用程序时,我创建了一个 session 并在 cookie 中发送了 JSESSIONID。

直到现在我们有一个非常简单的 UI 服务几个 UI 组件时,这还不错。

但是,现在我们的后端有几个 REST 端点,我们希望它们也经过身份验证。 REST 端点本身是使用 Jersey 开发的。

如果我理解正确,SAML 显然不是纯基于 REST 的端点的选择,因为 SAML 主要是一种基于浏览器的协议。这些 REST 端点将由我们的 UI 调用,我们希望它们通过 Postman 或其他东西独立调用以进行测试。

当客户端调用这些 REST API 时,我猜客户端应该发送一个授权 header,它应该由后端的身份验证过滤器之一检查。在验证客户端和用户之后,过滤器应该在 SecurityContext 中注入用户信息,因为 Jersey 在所有 REST 端点中注入 SecurityContext。然后从这个 SecurityContext 中获取用户就变得更容易了。

经阅读,Okta OpenID Connect 似乎是发布 JWT 的一种选择。但是我不清楚如何使用它。也就是说,当 Okta 发出 JWT 时,我们的 UI 或与此相关的任何客户端是否应该继续将授权 header 中的 JWT 发送到我们的 API,然后我们的 API 又应该将 JWT 发送到 Okta 以进行验证是吗?

问题是什么是同时提供 UI 和 session 登录以及身份验证 REST 端点的最佳选择?更不用说 REST API 本质上是无状态的。

When a client would call these REST APIs, I am guessing the client should send an Authorization header which should be checked by one of the authentication filters in the backend

在 OpendID Connect (OIDC) 中,授权 header 中的值是 id_token,可以是 JWT 格式。此 id_token 由 OIDC 服务器发布,作为您选择并适用于您的案例的 OIDC 授权类型 的最后一步。

Upon reading, it seems Okta OpenID Connect can be one choice which issues a JWT. However I am not clear on how to use this. That is, when Okta issues a JWT should our UI or any client for that matter keep sending the JWT in the Authorization header to our APIs and then our APIs in turn should send the JWT to Okta to validate it?

认为您在此体系结构中有 3 个组件。依赖方(客户端)、身份服务器/授权服务器/OIDC 提供商和资源服务器(您的后端及其数据)。当 Authorization Server 向 Relying Party 发出 id_token 时,你的 Resource Server 也知道这个 token。因此,当您在资源服务器中请求数据时,您会将 id_token 提交给资源服务器,它知道它是否有效 id_token 或无效

Question is what is the best choice to serve both, a login for the UI and a session and authenticating REST endpoints?

OIDC 提供程序(如果您需要更复杂的操作,则为身份服务器),因为 OIDC 是授权(核心是 OAuth 2.0)和身份验证。