背景:
有几个服务(spring boot REST API 服务和其他一些使用 REST API 的产品)作为后端,一些 angular 应用程序(一些具有不同二级域名的网站)作为前端。
一个前端应用可以通过异步方式调用一些后端服务(它们通过反向代理在同一个域下,所以没有CORS问题)。
目标
SSO,即。如果用户成功登录前端应用程序,则用户无需再次登录即可访问其他应用程序。(当然,在启用cookie的同一浏览器中)
问题
许多文档/提示/帖子建议 REST API 应该遵循客户端凭据流,因为它是无状态的并且不知道重定向 uri。但是,如果我没记错的话,使用客户端凭据流来实现 OSS 是不可能的,否则所有后端服务都应该是 keycloak 中可以共享client_id
和client_secret
.
如果使用Authentication Code Flow,问题是前端如何在用户成功登录后检索响应数据。 过程类似于:
front-end back-end keycloak
| -- asyn call --> |
| <-- HTTP 302 -- |
| -- redirect to login page --> |
| <-- redirect to where ???-- |
如果问题 1 的答案是遵循 Client Credentials Flow,那么在多个后端服务之间共享相同client_id
且共享的最佳实践client_secret
吗?或者还有其他解决方案吗?
如果问题 2 的答案是遵循 Authentication Code Flow,那么成功登录后如何处理异步 REST API 调用?
1.) SSO 协议
Open ID Connect
应该使用。理论上也有SAML
,但那个是为 Web 应用程序指定的,而不是为 SPA 应用程序/REST API 指定的。
2.) 前端(SPA 应用程序)管理身份验证
您需要用户身份,因此客户端凭据流不正确。你需要Authorization Code Flow with Proof Key for Code Exchange (PKCE)
. 使用成熟的(OIDC 认证的)库(例如https://github.com/damienbod/angular-auth-oidc-client),他们将管理一切(令牌刷新、路由授权、注销等)。您不需要任何名称中带有 Keycloak 的库(OIDC 是标准,必须实现,而不是 Keycloak)。Fronted 为每个 API 请求添加访问令牌(例如使用 Angular 拦截器)。
3.) 后端(REST API)只验证令牌
来自前端的调用是XMLHttpRequest
请求——它们在后台。有 302 响应(重定向到 auth)是没有意义的。用户将无法看到这一点,所以这就是为什么401 Unauthorized
应该返回的原因(然后前端可以有自己的业务逻辑来处理它——例如重定向到身份验证)。所以后端不需要实现任何登录流程。他们只验证请求中使用的令牌的有效性。最终,他们进行授权,例如,只有具有某些特定组/角色的用户才能执行相同的操作 - 只有编辑者可以编辑,只有管理员可以删除,否则以正确的响应代码响应 - 403 Forbidden
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句