【发布时间】:2020-08-07 09:15:29
【问题描述】:
请耐心等待我解释我的问题和我找到的解决方案/指南。
描述:在我的公司,我们有一个产品有多个模块。每个模块都是其独立的后端和前端。我们有 JavaEE/JakartaEE 和 JAX-RS 作为我们的后端堆栈和 React 作为我们的前端。到目前为止,我们通过会话使用 JavaEE Security Basic Authentication,但是由于产品在不断发展,我们需要移动客户端并允许第三方访问数据,因此我们决定集成 OAuth2/OpenID Connect进入我们的应用程序。
由于有多种实现提供 OAuth2 功能,我们目前正在研究一些可用的选项。 (例如Keycloak 和ORY Hydra)。我们将选择的决定取决于我们想要做多少工作来改变应用程序的现有结构,我们如何处理数据库中的用户。但无论我们选择哪种实施方式,我们都会遇到类似的问题。
问题
-
React 应用程序如何处理登录过程和令牌存储?
每个文档都说:如果用户没有登录,他/她会被重定向到登录页面。在登录并同意后,他将被重定向回应用程序(显然在完成 oauth2 工作流程之后),使用资源服务器的访问/ID 令牌和/或刷新访问/ID 令牌的刷新令牌。
现在我不清楚的是:
由于这是我们自己的 React 应用程序,我们不想显示同意屏幕,就像在 Microsoft/Google 等应用程序中您看不到任何内容一样。我想这可以通过在请求本身中设置一个值,或者根据客户端 ID 跳过同意屏幕来实现,但我只是想确定一下。
-
接下来我在哪里存储访问和刷新令牌?访问令牌应作为承载令牌与每个请求一起发送。因此它可以存储在本地存储中,因为它们是短暂的,但刷新令牌应该安全存储。就像在安全的 http cookie 中一样?如果是这种情况,那么服务器必须设置它。如果这是正确的,流程会是这样吗?
Our React App (Not logged In)-->Login Page (Another React Page)-->User Enters Credentials-->Java Backend-->Authenticates the user-->Initiate the OAuth2 process-->Get the Access and Refresh Tokens-->Set them as secure Cookies-- >Return the authenticated response to frontend with the cookies-->Login Page redirects to the previous page-->User continues with the app这感觉不正确。在这种情况下,PKCE 将如何提供帮助?
假设我上面写的是正确的,当用户从我们自己的应用程序或第三方应用程序登录时,我将需要不同的登录流程。但是,这可以通过检查客户端 ID 或禁用第三方客户端的密码流来确定。
同样适用于刷新令牌流。因为对于我自己的应用程序,我必须设置 cookie,对于第三方,这必须直接来自 OAuth 服务器
我已阅读/研究过的资源:
https://gist.github.com/mziwisky/10079157
编辑:添加更多我已阅读的链接
What is the purpose of implicit grant
Best practices for session management
当然还有来自 Keycloak 和 ORY Hydra 的各种著作和例子。
我目前正在同时尝试 Keycloak 和 ORY Hydra,以确定哪个更适合我们的需求。
提前谢谢大家!
【问题讨论】:
标签: security authentication oauth oauth-2.0 openid-connect