spring boot—如何使用多后端服务和解耦体系结构实现sso

tnkciper  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(382)

背景:
有几个服务(spring boot rest api服务和其他一些使用rest api的产品)作为后端,一些angular应用程序(一些具有不同二级域名的网站)作为前端。
一个前端应用程序可以使用异步方法调用一些后端服务(它们通过反向代理位于同一个域下,因此没有cors问题)。
目标
sso,即。如果用户成功登录到前端应用程序,则该用户应无需再次登录即可访问其他应用程序(当然,在启用cookie的同一浏览器中)
问题
RESTAPI应该遵循客户端凭据流(如果未经验证,则返回401)还是验证代码流(如果未经验证,则返回302)?
许多文档/提示/帖子建议RESTAPI应该遵循客户端凭据流,因为它是无状态的,并且不知道重定向uri。但是,如果我没有错的话,就不可能使用客户端凭据流实现oss,否则所有后端服务都应该是KeyClope中的同一个客户端,可以共享 client_idclient_secret .
如果使用身份验证代码流,问题是在用户成功登录后前端如何检索响应数据。这个过程类似于:

front-end             back-end     keycloak
    |  -- asyn call -->  |
    |  <-- HTTP 302 --   |
    |  -- redirect to login page -->  |
    |     <-- redirect to where ???-- |

如果问题1的答案是遵循客户端凭据流,那么共享相同的凭据是最佳做法吗 client_idclient_secret 在几个后端服务之间?或者还有其他解决方案吗?
如果问题2的答案是遵循身份验证代码流,那么成功登录后如何处理异步rest api调用?

taor4pac

taor4pac1#

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)他们将管理一切(令牌刷新、路由授权、注销等)。您不需要任何名称中带有keydape的库(oidc是标准,必须实现,而不是keydape)。fronted向每个api请求添加访问令牌(例如,使用Angular 拦截器)。
3.)后端(RESTAPI)只需验证令牌即可
来自前端的电话是 XMLHttpRequest 请求-它们在后台。有302响应(重定向到auth)是没有意义的。用户将无法看到这一点,这就是原因 401 Unauthorized 应该返回(这样前端可以有自己的业务逻辑来处理-例如重定向到auth)。因此后端不需要实现任何登录流。它们只验证请求中使用的令牌的有效性。最终,他们进行授权,例如,只有具有某些特定组/角色的用户才能执行相同的操作-只有编辑可以编辑,只有管理员可以删除,否则使用正确的响应代码进行响应- 403 Forbidden .

相关问题