有很多如何实现 OpenID Connect 身份验证的示例。在节点 - 代码授予(+客户端密码)。 有很多如何在 React (SPA) 中实现 OpenID 的示例 - 使用 PKCE 进行代码授权
即使我知道 PKCE 它相当安全,但是我觉得将身份验证仅放在客户端是很糟糕的。 每个 React SPA 都有后端(至少应该托管在某个地方)。
我希望在 Node (Express) 中拥有服务器端来安全地保存客户端密码并使用 Identity Server 和完成所有繁重的工作 React 前端。
正如我已经说过的,有很多“带有模板引擎的 Node (Express)”用于身份验证的示例。 但我想使用 React 作为“模板引擎”。
所以,我正在寻找它的完整和正确的实现。同时我找不到它。 有人可以帮我找一个例子吗?
这里总结了 2 种常见的解决方案类型:
插入客户端库(如OIDC客户端)来完成繁重的工作,这样您就不必自己编写太多安全代码。该库在接受令牌之前会运行许多安全检查。它曾经很流行,但现在不太令人满意,因为第三方 cookie 限制阻止了流程的某些部分可靠地工作。
使用后端作为前端解决方案,使您的 SPA 获得 HttpOnly cookie。这提供了更强的安全性并且是首选,但需要更复杂的流程。您可以使用像 openid-client 这样的 Web 后端库来发出 cookie,也可以使用在与 SPA 相同的父站点中运行的实用程序 API。
我在网上找到了2个解决方案。
第一个: 使用 React + RESTful API 实现社交认证
- 在前端,出现第 3 方应用程序的登录弹出窗口。
- (仍在前端)获取第 3 方应用程序在>同意登录后返回的身份验证令牌。
- (是的,仍然是前端)将该令牌作为>请求正文的一部分发送到后端。 (我喜欢使用 Blob,但那就是我。)
- 在后端验证令牌。
- 如果令牌是真实的,您将收到用户作为验证>响应的一部分(至少我们将使用的 Passport.js 是这种情况)。
- 将用户的数据保存到您的数据库中。
- 向前端返回 JWT 令牌。您使用该令牌执行的操作超出了本教程的范围,但它可能应该用于验证每个登录用户的操作。
解释得很好,有 github 工作示例social-auth-example 它仅用于社交身份验证,但我认为制作更通用的东西或至少添加我的 OpenID Connect Auth 是没有问题的。提供商。
第二个例子: 使用 Twitter、Google、Facebook 和 Github 进行 React 身份验证
此方法使用socket.io。非常有趣。
附注 因此,我需要弄清楚哪种解决方案更安全以及是否存在任何安全漏洞。 这不是一件容易的事。很遗憾,我的问题没有标准流程。我可以找到 1000 个理由来说明为什么最好将所有繁重工作放在后端而不是依赖 OIDC 客户端库。第一个原因是我的老板:)