spring-boot - 如何在前端访问安全的 API?
问题描述
互联网上有很多很好的内容解释了如何使用 Keycloak 保护 Spring API:在 Keycloak 中创建一个代表 API 服务的客户端,并使用如下链接来获取访问和刷新令牌:
<Domain>/auth/realms/<realm>/protocol/openid-connect/auth/{some parameters}
这会产生两个令牌。到目前为止,一切都很好。
但是,现在我不确定前端访问 API 的流程应该是什么样子。
前端是否应该直接访问此端点并因此获取访问和刷新令牌?这意味着 API 只能具有访问类型 public,因为无法安全地存储客户端(API)机密。
或者是否应该有第三台服务器以某种方式为每个用户存储刷新令牌,如果他的访问令牌不再有效,用户可以调用该服务器。然后,该服务器将使用客户端的刷新令牌(以及可以安全存储的客户端密码,因为它将在后端)从 Keycloak 获取新的访问令牌并将其转发给用户。
我想我要问的主要问题是,客户端/用户是否应该获得刷新令牌。
如果需要根据第二个选项实现逻辑,我会对如何在 Spring 中完成这样的事情的链接或描述感兴趣。
解决方案
我认为,无论哪种情况,您都需要使用授权代码流。不得再使用以前版本的 OAuth2 中建议用于 SPA(没有后端服务器的前端)的隐式流。
最好的选择是拥有一个后端服务器,因此用户通过重定向检索身份验证代码,后端服务器将此身份验证代码与访问和刷新令牌交换(并保留它们而不将它们转发到前端)。
如果没有适当的后端并且您的前端需要直接检索和保存令牌,我建议将授权代码流与公共客户端和 PKCE 扩展一起使用(简单地说,它可以确保请求身份验证的实体代码与请求令牌的实体相同,并且验证码没有被外国实体窃取和使用)。有几个来源具有更详细的解释,可能会对您有所帮助,例如:https ://auth0.com/docs/flows/authorization-code-flow-with-proof-key-for-code-exchange-pkce
希望这对您的架构考虑有所帮助。
推荐阅读
- linux - 屏幕处理程序(例如.vi、less)如何工作?
- asp.net-core - 使用 Asp.net 核心和 Identityserver 4 从浏览器获取 401,但从邮递员获取 200
- p5.js - 如何在 Vue 3 中使用 p5.loadImage
- visual-studio-code - 在 Visual Studio 代码中使用 Tab 按钮自动完成后的智能感知问题 - 版本:1.52.1
- postgresql - 如何使用 Windows 批处理脚本将 PostgreSQL 查询结果导出到 csv 文件(不使用“\COPY”)
- python - 对准确度分数进行变化以纳入序数
- matlab - 如果数字重复-Matlab如何打破循环
- laravel - 将模型传递给邮件视图
- python - 我在我的项目中创建了虚拟环境,它通过 git bash 进行 git clone。但是我的点子不起作用,它坏了
- mysql - 将一个表中的 n 行更新为另一个表中的 n 行(无外键)