关于如何从客户端(web/mobile…)安全访问资源api有几个选项,近年来,在JS/TS中为spa实现OIDC是很常见的,这已不再推荐。
对于SPA的建议是避免在浏览器中存储令牌或使用service worker,并使用BFF而不是直接连接到身份服务器。
在这种方法中,BFF作为身份服务器的代理并处理所有的oauth请求。
使用spring BFF实现此模式的最佳实践是什么,或者是否有其他更好的方法。
也许你知道这个解释选项的文档。假设你正在使用SPA,不想要网站选项,有两个选项,从安全的角度来看是相同的,你使用哪个是你的偏好问题。
WEB端
SPA首先向web后端发送OAuth和API请求,web后端转发它们并实现OAuth客户端。web后端使用发出cookie的运行时。
pro是一个更容易的初始开发人员设置和更少的组件部署。缺点是所有开发人员都必须运行后端,并且web部署选项仅限于那些可以托管运行时的选项。
反向代理后端
SPA通过NGINX等反向代理发送OAuth和API请求。OAuth请求被转发到实用程序API。web后端只保留静态内容。
的优点是,你可以摆脱cookie发布运行时从开发人员的个人电脑,更容易做的事情,如部署web资源到内容交付网络。缺点是最初的开发人员设置比较困难,并且有更多的移动部件。
在这两种情况下,SPA使用这样的url,用于静态内容,oauth客户端和API路由责任。
- https://www.example.com
- https://www.example.com/oauth-client
- https://www.example.com/api
在oauth-client路径中,SPA像这样调用端点。SPA OAuth代码很轻:
- POST/登录/开始
- POST/登录/结束
实现
有相当多的组件,包括您可以插入的组件。搜索一个术语,比如BFF OAuth
,然后做一些阅读。但这是一个旅程——饼干是复杂的小东西。
我刚刚在我的一个仓库中添加了一个教程,用于将spring-cloud-gateway
配置为使用会话(Secure HttpOnly cookie)保护的浏览器应用程序和OAuth2资源服务器之间的BFF。
这个示例使用Angular作为UI框架,我对spring-boot-starter-oauth2-resource-server
的一个薄包装,并使用Keycloak作为授权服务器,但这是实现细节,所有的工作都是由BFF完成的。