【问题标题】:Implementing SSO on React-Redux app在 React-Redux 应用上实现 SSO
【发布时间】:2017-12-06 01:11:56
【问题描述】:

我正在尝试在使用 Keycloak 作为外部身份提供者的 React-Redux 应用程序上实现 SSO。目的是在用户未通过身份验证时重定向到 IdP 的登录页面,并且在成功身份验证后使用 access_token 访问另一个 REST API 微服务上的受保护资源。

我尝试使用 Keycloak 的 NodeJS 适配器 (https://keycloak.gitbooks.io/documentation/securing_apps/topics/oidc/nodejs-adapter.html),它能够将我重定向到 IdP 进行登录,我可以获得 access_token,但这一切都发生在 express-session 中并使用 MemoryStore。我想知道这样可以吗?在快速存储中保存 JWT 并在进行 API 调用时从存储中检索它们?

或者我应该尝试在 Redux 的商店中保存身份验证状态(JWT 令牌)吗?与会话 cookie 相比会更好吗?会话 cookie 可能更安全,但每次都需要访问商店,对吧?

最重要的是,我怎样才能实现 Redux 商店有 JWT 的方法?

任何帮助将不胜感激。

提前致谢。

【问题讨论】:

标签: reactjs redux single-sign-on react-redux keycloak


【解决方案1】:

对于所有感兴趣的人,我设法通过以下方式实现它:

  • 从 keycloak 服务器加载 Keycloak.js(Keycloak 的 JS 适配器)
  • 使用客户端的配置参数初始化 Keycloak 脚本。
  • 当主 React 组件即将呈现时,通过调用 Keycloak 脚本创建一个 Reducer 以获取 JWT 令牌。
  • 将令牌添加到状态。

无论如何,我们现在认为从服务器动态加载 Keycloak.js 并不是一个好主意,最重要的是,这会使我们的应用程序与 Keycloak 紧密耦合。我们现在正在寻找更通用的 OIDC 实现。

至于存储令牌,我们认为 Redux 存储可能不是 JWT 的最佳位置。我们正在考虑将令牌保存在 localStorage 中。

希望这对某人有所帮助!

【讨论】:

  • 看看 redux-oidc 或称为 oidc-client 的实际执行工作的低级库 - 包括 JWT 处理(无论您想要哪种存储!)和 Redux 存储更新-盒子。也已经回答了您的重复问题...
  • @Leon,虽然 redux-oidc 和 oidc-client 库看起来都很棒,我都试过了,但我的用例与它们提供的有些不同。我的应用程序中没有登录(或未经身份验证的页面)组件。默认情况下,我们的目标是保护应用程序的所有路由,因此像 CallbackComponent/redirect_uri 这样的事情是我们无法做到的。现在,我在 react-router 的 onEnter 中初始化了 OIDC 适配器并开始工作,但现在我正试图让授权代码流在 SPA 中工作以保护我的客户端机密!
  • 我也没有“登陆页面”,并且“CallbackComponent”受到所有其他路由的保护(是的,在 SPA 中)...任何命中都将获得身份验证,CallbackComponent 只是正确设置 localStorage/cookies(并检查用户的过期时间等)以避免每次都访问身份验证服务器。在这里一切正常;)
  • 哦!那太好了。因此,您有一个仅用于设置/刷新令牌的组件,并将其视为 CallbackComponent。那很整齐。这样一个组件的路由应该是什么?如果 /home 是用户启动登录的地方,而 /callback 是我们存储令牌的地方,那么如何将用户重定向回他开始的地方?历史?请添加这些作为答案,以便我接受。
【解决方案2】:

这是一个react app,它演示了我们如何将 SSO 与 React 应用程序集成。

  • 使用 Keycloak 作为 IDP
  • SSO 的 OAuth 2
  • JWT 作为 Auth Token(可以存储在 Redux 中,而不是 Authprovider 状态)
  • 反应用户界面
  • Node Js (Express) 后端

免责声明:我是回购的所有者

【讨论】:

  • 这看起来很酷。但在我的情况下,我需要具有 OAuth2 支持的 React + Spring boot 以支持多个 SSO。 (一次一个)。在后端将进行令牌验证。我正在寻找一种在 React 中使用通用代码/npm 包来支持多个授权服务器的解决方案。我刚开始使用 KeyCloak。 (但不应该在 React 中使用 KeyClock 特定的 npm 包,它也应该是支持其他 Auth 服务器的通用库)。是否有一个依赖(或)代码示例??
猜你喜欢
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 2017-10-16
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多