spring-boot - 如何使用 Spring Security 实现基本的 IAM oauth2 流程?
问题描述
我目前正在使用spring security oauth2进行开发。
目前,前端是 SPA,它被开发为与客户端重新渲染一起操作的 react。
我的 rest api 有 spring security starters 库。但是我不知道如何使用spring提供的oauth2 flow。
所以我的问题是:我可以使用 spring security 作为 IAM 来保护我的 web 和 api 吗?
Spring Security 是否有已知的 oauth2 授权以及如何使用它们?
- 隐式授权
- 客户凭证授予
- 密码授予
解决方案
不要使用隐式授权
不建议使用隐式流(并且某些服务器完全禁止此流),因为在 HTTP 重定向中返回访问令牌而没有任何确认客户端已收到它的固有风险。
来源:https ://oauth.net/2/grant-types/implicit/
使用隐式授权,无需额外的授权代码交换步骤即可立即返回访问令牌。这个额外的步骤通常在您的后端执行。
网页 > 令牌 > Api
SPA 前端及其 Rest Api 是一种非常常见的方法,从简单的初创公司到大公司都在使用。总结的流程是:
- 您的用户将启动 Web 应用程序。
- 由于他们之前没有登录,您的 Web 应用程序将向他们显示登录屏幕(授权服务器提供的页面)。
- 验证后,向用户显示同意书。
- 用户同意后,授权服务器会向您发送一个授权码。
- 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 应用程序。
- 由于他们之前没有登录,您的 Web 应用程序将向他们显示登录屏幕(由spring-security提供的页面)。
验证后,向用户显示同意书。用户同意后,授权服务器会向您发送一个授权码。Web 应用程序将用此代码交换令牌。由于您的 api 使用 Spring 安全性,因此涵盖了令牌生成。- 取回此令牌后,Web 应用程序将其存储在客户端(浏览器)中,并在需要使用 API 时将其作为标头发送。
您的私有休息 api 必须通过将 Web 应用程序(标头)的令牌发送到授权服务器的一个端点来验证它是否有效,我认为 spring 安全链过滤器可以处理这个问题。- 如果令牌有效,则允许您的 api rest 响应 Web 客户端。例如包含产品、员工、客户订单详细信息的一些更新等的 json
这里有一些带有spring security的令牌生成和受保护端点的示例。我将尝试上传一个可以使用的示例:
我是
如果你以后有更多的应用和复杂的场景,我建议你选择一些开源的iam,比如:
- Glewlwyd,Keycloak,OAuth.io,ORY Hydra,SimpleLogin,SSQ 登录,
商业服务,例如:
- Auth0,Curity Identity Server,FusionAuth,Okta,Red Hat Single Sign-On,cidaas。
或者尝试使用纯 spring-security 开发一个新的
讲座
一些带有更多 oauth2 详细信息的推荐答案:
推荐阅读
- javascript - 数据描述符和访问器描述符有什么区别?
- android - 仅手机纵向,平板电脑所有方向:无法解析符号“ActivityInfo”
- firebase - FlutterFire 如何使用 onAuthStateChanges?
- oracle - 查询以查找给定值的前后值
- python-3.x - Python 3字符串按字母顺序排列?
- java - 有没有办法检测Android中何时出现弹出窗口
- prometheus - 通过python脚本的Prometheus健康状态
- sparql - 仅获得英语财产价值
- r - 如何在r中创建栅格的随机点(1000)
- javascript - 使用 Chrome 控制台 ( javascript ) 的鼠标位置脚本