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

时间:2014-10-15 01:44:41

标签: rest oauth oauth-2.0 openid jwt

我们有一个基于cookie的常规Web应用程序,现在我们想要分割前端和后端(api)以便拥有第三方公共API。所以我们的后端将在一个域上并在另一个域前端。

对于授权,我们想切换OAuth 2 with JWT。在这种情况下,我们的前端应用程序将不得不使用access_token而不是cookie会话,这带来了一个很大的问题:

如何保持登录 - 臭名昭着的#34;记住我"复选框(来自Form based authentication for websites的第二部分)

从OAuth2的角度来看,我们的前端应用程序将使用Resource Owner Password Credentials GrantImplicit Grant之间的内容。它更接近密码凭据授权,因为我们仍然会使用通常的登录表单,并且不会将用户重定向到另一个域以便登录。同时它更接近隐式授权,因为它只是浏览器和&基于JavaScript的access_token将保存在浏览器中。

RFC says授权服务器如果您使用隐式授权,则不得发出刷新令牌,我的问题是,如果您在此用例中它仍然有效#39;真的使用三维派对OAuth,但你自己的api?本能地我觉得在浏览器中使用refresh_token是一个安全漏洞,并希望与你们确认,但refresh_token似乎是持久登录工作方式与我们一样的唯一方法用饼干。

<小时/> @FlorentMorselli发表评论后 UPD

如果我可以将refresh_token与仅浏览器应用程序一起使用,那么OpenID规范仍然无法回答我的问题

  • Google says仅为refresh_token
  • 提供access_type=offline
  • OpenID Connect Core says您不能使用带有隐式流的刷新令牌
  • OpenID Connect Core says与使用混合流程
  • refresh_token无关
  • 只有one place里面有一些关于refresh_token混合流程的内容,但没有精确的

UPD2 感谢@reallifelolcat

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


我认为分裂api和前端这些日子变得越来越普遍,如果你分享如何解决这个持久登录问题并且如果你完全放弃它并强迫用户强迫它我会很感激每隔X周重新登录一次。

谢谢!

1 个答案:

答案 0 :(得分:4)

访问令牌和刷新令牌与使用OpenID Connect的 login 无关。这些仅用于授权访问用户个人资料信息以及可能对您的身份验证服务调用登录后的公共API。请参阅规范,了解ID令牌和访问令牌之间的区别。

如果您打算使用OpenID Connect进行登录,那么从您目前所写的内容开始,听起来您需要托管自己的OpenID提供程序(OP),因为您希望避免转到另一个域登录:

  

我们仍然会使用常用的登录表单,并且无法将用户重定向到其他域名以便登录。

如果您想成为自己的身份提供商,那么您将获得更多权力。这意味着您必须部署自己的OpenID Connect服务器工作实例,并配有授权和令牌端点。

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

由您决定用户如何保持登录OP服务器,但只要用户至少授权浏览器应用程序一次: http://openid.net/specs/openid-connect-core-1_0.html#Consent 然后,您可以保存此浏览器应用程序登录所有未来请求的同意,从而保持持久登录。

您将不得不考虑如何处理会话管理,但听起来您已经有了一些cookie,所以您可以使用它(请参阅此答案:{ {3}})。否则,您最终会遇到浏览器webapp必须始终获取新ID令牌的情况。

正如Florent所提到的,在进行基于浏览器的webapp的公共客户端时,您应该考虑安全性因素。例: OpenID sign in mechanism - Stay signed in