【问题标题】:How implement a basic IAM oauth2 flow with spring security?如何使用 Spring Security 实现基本的 IAM oauth2 流程?
【发布时间】:2021-05-04 06:43:48
【问题描述】:

我目前正在使用 spring security oauth2 进行开发。

目前,前端是 SPA,它被开发为与客户端重新渲染一起操作的 react。

我的 rest api 有 spring security starters 库。但是不知道怎么用spring提供的oauth2 flow。

所以我的问题是:我可以使用 spring security 作为 IAM 来保护我的 web 和 api 吗?

spring security 是否有已知的 oauth2 授权以及如何使用它们?

  • 隐式授权
  • 客户端凭据授予
  • 密码授予

【问题讨论】:

  • 在这部分如果我想使用密码授权认证,我是否需要一个后端服务器来保存前端的客户端密码和客户端ID?,为什么客户端/secret 在密码授权认证中是必需的吗?也许你可能会说:如果我想使用密码授权认证,我是否需要一个后端服务器来保存前端发送的用户/密码?
  • 您的应用程序有登录表单吗?

标签: spring-boot spring-security oauth-2.0 single-page-application amazon-iam


【解决方案1】:

不要使用隐式授权

不建议使用隐式流(并且一些服务器完全禁止此流),因为在 HTTP 重定向中返回访问令牌而没有任何确认客户端已收到它的固有风险。

来源:https://oauth.net/2/grant-types/implicit/

使用隐式授权,无需额外的授权代码交换步骤即可立即返回访问令牌。这个额外的步骤通常在您的后端执行。

Web > 令牌 > Api

SPA 前端及其 Rest Api 是一种非常常见的方法,从简单的初创公司到大公司都在使用。总结的流程是:

  • 您的用户将启动 Web 应用程序。
  • 由于他们之前没有登录,您的 Web 应用将向他们显示登录屏幕(授权服务器提供的页面)。
  • 身份验证后,会向用户显示consent form
  • 用户同意后,授权服务器会向您发送一个授权码。
  • Web 应用程序将用此代码交换令牌。
  • 取回此令牌后,Web 应用将其存储在客户端(浏览器)中,并在需要使用 api 时将其作为标头发送。
  • 您的私有 rest api 必须通过将 Web 应用程序的令牌(标头)发送到授权服务器的一个端点来验证它是否有效
  • 如果令牌有效,则允许您的 api rest 响应 Web 客户端。例如,包含产品、员工、客户订单详细信息的一些更新等的 json

要使此流程生效,您需要:

  • 带有后端提示的网络水疗中心。后端是必需的,因为您无法在 apache 或 nginx 等静态解决方案中拥有正确的用户会话。
  • 身份验证和授权服务器:称为身份和访问管理 (IAM) 或某些第三方应用程序,它为您提供基本的 oauth2 端点来管理您的应用程序的适当安全性。
  • 您的 api:foo-api、bar-api、baz-api 等

弹簧安全

在以下最小场景中:

  • 您将只有一个 web + 一个 rest api,以后再也不会有(移动设备、物联网等)
  • 您没有身份验证/授权服务器
  • 您在一个工件中混合了功能性 api(员工、产品等)及其安全性(spring-security)
  • 您的网络中不需要用户会话
  • 您不需要注销功能

流量可以减少到:

  • 您的用户将启动 Web 应用程序。
  • 由于他们之前没有登录,您的网络应用会向他们显示登录屏幕(由 spring-security 提供的页面)。
  • 验证后,会向用户显示consent form
  • 用户同意后,授权服务器会给你发送一个授权码。
  • Web 应用程序将用此代码交换令牌。 由于您的 api 使用 Spring 安全性,因此涵盖了令牌生成。
  • 取回此令牌后,Web 应用将其存储在客户端(浏览器)中,并在需要使用 api 时将其作为标头发送。
  • 您的私有 rest api 必须通过将其发送到授权服务器的一个端点来验证 Web 应用程序(标头)的令牌是否有效我认为 spring 安全链过滤器可以处理这个问题。
  • 如果令牌有效,则允许您的 api rest 响应 Web 客户端。例如,包含产品、员工、客户订单详细信息的一些更新等的 json

这里有一些使用 spring 安全性的令牌生成和受保护端点的示例。我会尝试上传一个可以使用的示例:

IAM

如果你以后有更多的应用和复杂的场景,我建议你选择一些open-sourceiam like:

  • Glewlwyd、Keycloak、OAuth.io、ORY Hydra、SimpleLogin、SSQ 登录,

商业服务,例如:

  • Auth0,Curity Identity Server,FusionAuth,Okta,Red Hat Single Sign-On,cidaas。

或者尝试使用纯spring-security开发一个新的

讲座

一些带有更多 oauth2 详细信息的推荐答案:

【讨论】:

  • 首先,感谢您的友好回答。我已经阅读了您写下的所有内容,但有些内容我不太理解。在你告诉我的场景中,是否有一个功能可以生成一个只有 Spring Security 而没有身份验证服务器的令牌? (您是说自己生成令牌,而不是使用 oauth 库吗?)*如果可以,请参考链接。
  • 另外,如果通过谷歌登录功能等外部认证服务器进行认证,传递到前端的访问令牌是否成为谷歌的访问令牌?还是谷歌登录过程只有身份验证,传递到前面的访问令牌是我自己的身份验证服务器的访问令牌?再次感谢您的回答。
  • #1 我添加了一篇文章,您可以在其中了解如何生成令牌以及如何使用它来保护您的端点。 #2 关于谷歌的非常好的问题。作为总结,您可以重新使用 google 的 access_token(在这种情况下,不需要 spring security)或使用 google 作为 spring security 安全流程中的额外步骤。 #3 尝试获得更多声望来使用这个房间chat.stackoverflow.com/rooms/228089/…
猜你喜欢
  • 2015-11-27
  • 2014-05-10
  • 2016-09-18
  • 2020-10-23
  • 2017-10-27
  • 2016-02-07
  • 2016-04-26
  • 2018-12-18
  • 2017-06-10
相关资源
最近更新 更多