Rest 基于浏览器的OAuth/OpenID,具有持久登录

Rest 基于浏览器的OAuth/OpenID,具有持久登录,rest,oauth,oauth-2.0,openid,jwt,Rest,Oauth,Oauth 2.0,Openid,Jwt,我们有一个基于cookie的身份验证的常规web应用程序,现在我们想要拆分前端和后端(api),以便拥有第三方公共api。因此,我们的后端将在一个域上,前端将在另一个域上 对于授权,我们希望切换为。在这种情况下,我们的前端应用程序将不得不使用access_令牌而不是cookie会话,这带来了一个老问题: 如何保持登录-臭名昭著的“记住我”复选框 从OAuth2的角度来看,我们的前端应用程序将使用到之间的内容。它更接近于密码凭证授权,因为我们仍然将使用通常的登录表单,并且不会为了登录而将用户重定向

我们有一个基于cookie的身份验证的常规web应用程序,现在我们想要拆分前端和后端(api),以便拥有第三方公共api。因此,我们的后端将在一个域上,前端将在另一个域上

对于授权,我们希望切换为。在这种情况下,我们的前端应用程序将不得不使用access_令牌而不是cookie会话,这带来了一个老问题:

如何保持登录-臭名昭著的“记住我”复选框

从OAuth2的角度来看,我们的前端应用程序将使用到之间的内容。它更接近于密码凭证授权,因为我们仍然将使用通常的登录表单,并且不会为了登录而将用户重定向到另一个域。同时,它更接近于隐式授权,因为当
access\u token
将保存在浏览器中时,它将只使用浏览器&基于JavaScript

如果您使用隐式授权,则RFC授权服务器不得发出刷新令牌,我的问题是,当您实际上使用的不是3D party OAuth而是您自己的api时,该令牌在本用例中是否仍然有效?本能地,我觉得在浏览器中使用
refresh\u-token
是一个安全漏洞,我想和你们确认一下,但是
refresh\u-token
似乎是让持久登录像使用cookie一样工作的唯一方法。
UPD在@FlorentMorselli评论之后:

如果我可以将
refresh\u token
与纯浏览器应用程序一起使用,OpenID规范仍然不能回答我的问题

  • 谷歌他们提供的
    refresh\u令牌
    仅用于
    access\u type=offline
  • OpenID Connect Core无法将刷新令牌与隐式流一起使用
  • OpenID Connect Core与混合流使用
    刷新\u令牌无关
  • 只有在这里,它说了一些关于混合流的
    刷新\u令牌
    的有希望的东西,但没有确切的说明

UPD2感谢@realLifeolcat

看起来OpenID Connect不明确支持,这意味着您必须将用户重定向到OpenID Connect服务器才能执行登录。您知道是否有其他方法通过OAuth 2.0对用户凭据进行身份验证吗


我相信拆分api和前端现在越来越普遍,如果您能分享如何解决这个持久性登录问题,如果您完全放弃它并强制用户每X周重新登录一次,我将不胜感激


谢谢

访问令牌和刷新令牌与使用OpenID Connect登录无关。这些令牌仅用于授权对用户配置文件信息的访问,并且可能用于在登录后对公共API进行身份验证的服务调用。有关ID令牌和访问令牌之间的差异,请参阅规范

如果您打算使用OpenID Connect进行登录,那么从您目前编写的内容来看,您似乎需要拥有自己的OpenID提供商(OP),因为您希望避免前往其他域登录:

我们仍然会使用通常的登录表单,不会为了登录而将用户重定向到另一个域

如果你想成为自己的身份提供者,那就给你更多的权力。这意味着您必须部署自己的OpenID Connect服务器工作实例,包括授权和令牌端点

现在,这就是持久登录的部分。您的浏览器webapp将成为您现在拥有的OP服务器的依赖方。当用户尝试使用OpenID Connect登录到您的浏览器应用程序时,他们需要向您的OP服务器进行身份验证。通过OIDC流程,您的浏览器应用程序将获得一个ID令牌,其中包含标识用户的颁发者/主题对

由您决定用户如何登录您的OP服务器,但只要用户至少授权浏览器应用一次: 然后,您可以保存该同意,以供此浏览器应用程序将来请求登录时使用,从而保持持久登录

你将不得不考虑如何处理会话管理,但是听起来好像你已经有一些cookie的事情已经开始了,所以你也许可以使用它(见这个答案:)。否则,您的浏览器webapp将不得不始终获取新的id令牌

也正如Florent所提到的,当你的基于浏览器的WebApp会做一个公共客户端的事情时,你应该考虑安全考虑。例子:


OAuth2不是身份验证协议,而是授权协议。如果您想使用OAuth2和JWT对用户进行身份验证,我建议您查看@FlorentMorselli感谢您的链接,我扩展了基于questionUser代理的应用程序是公共客户端,它们无法存储凭据和刷新令牌。这就是为什么这些客户端不能发出刷新令牌。本机应用程序(例如Android应用程序)提供“可接受的保护级别”。这就是为什么他们可能被允许获得访问令牌(请参阅)。@FlorentMorselli它确实允许您检索、使用和存储
access\u令牌。它不限制您在浏览器中仅使用隐式流。而且它仍然没有明确说明您不能在浏览器中使用不同类型流的
refresh\u token
,例如,据我所知,不支持使用隐式流的refresh token(查看)。您是对的,您不限于在浏览器中仅使用隐式流,您可以使用资源所有者密码凭据(如果可用)。使用混合流,您可以获得刷新令牌。但是这个刷新令牌永远不会发送到浏览器,而是通过令牌端点发送到客户端的重定向uri。非常感谢您的回答,根据您的链接,我能够找到听起来很有前途的规范