如何使用 Oauth2 和 javascript 客户端(Spring Oauth2 + Angularjs)实现长期登录会话

Posted

技术标签:

【中文标题】如何使用 Oauth2 和 javascript 客户端(Spring Oauth2 + Angularjs)实现长期登录会话【英文标题】:How to achieve long lived login session with Oauth2 and javascript client(Spring Oauth2 + Angularjs) 【发布时间】:2014-09-14 02:17:28 【问题描述】:

我有一个带有 Spring OAuth2Angular 客户端的 Spring 后端。

实现长期登录的正确方法是什么?这仍然可以说是安全

我想我可以使用密码流刷新令牌,但这似乎并不比使用长寿命访问令牌更安全浏览器客户端的隐式流。我想我可以使用:

重定向 - 这将干扰用户正在做的任何事情 弹出窗口 - 无需用户交互就会被阻止

在客户端级别。但是有没有更好的方法?

P.S:Cloudfoundry 的新 UI 似乎完全实现了我想要的。

【问题讨论】:

【参考方案1】:

身份验证代码流总是更出色(更安全,泄露用户证书的机会更小)。如果您正在编写一个浏览器托管的客户端直接联系 OAuth2 服务,那么很遗憾,您将无法从身份验证代码流中获取访问令牌。出于这个原因,我认为我更喜欢在机器(非浏览器)客户端之间使用访问令牌,并在浏览器和前端服务器之间使用标准的基于 cookie 的身份验证。如果您公开 /me 或 /user_info 类型的端点,您仍然可以在前端服务器上使用 OAuth2 进行身份验证(我很确定 CloudFoundry 服务器正在执行此操作)。

或者,如果您确实需要在客户端中获取访问令牌(我猜有处理它的库),您可以使用密码或隐式授权。出于安全原因,强烈建议使用隐式(因为用户只在身份验证服务器身份验证 UI 中输入他的密码),但在这两种情况下,您都需要注意隔离客户端数据,以便(未经身份验证的)客户端无法访问任何内容他们不应该。

【讨论】:

感谢 Dave,您的时间非常慷慨。 “如果我真的需要获取访问令牌”是什么意思?我最终需要访问令牌来访问我的 REST 后端,不是吗?另外,基于标准 cookie 的身份验证是指它作为 oauth2 的替代品还是仅用于身份验证部分? 如果您对这个相关问题给出快速意见***.com/questions/24925302/…,我将非常感激。我只是想看看如果我希望参与 FB 登录,是否可以选择密码授予。 我认为您不一定确实需要访问令牌才能从 javascript 客户端访问服务器(您只需要经过身份验证)。诚然,我对 javascript 库几乎一无所知,所以我不知道 angular 提供了什么,但是浏览器已经有了将 cookie 发送回源的合同,那么为什么不使用它们呢? 好的,我明白你的意思了。但是,如果我的应用程序趋于变大,因此需要单独的授权和资源服务器,那么唯一的方法就是访问令牌,对吧? 好点,我的坏。我想这就是存在隐式授权的原因。您可以使用我相信的刷新令牌(即使它不在规范中)。我并没有真正理解最初的问题,我必须承认。您对隐性授权有何担忧?【参考方案2】:

我的解决方案是使用带有隐式授权的隐藏 iframe。

【讨论】:

以上是关于如何使用 Oauth2 和 javascript 客户端(Spring Oauth2 + Angularjs)实现长期登录会话的主要内容,如果未能解决你的问题,请参考以下文章

如何保护来自iframe的Oauth2隐式流

如何修复google OAuth2错误?

使用 OAuth2 下载 Javascript 文件

来自客户端 javascript 的错误 400 Cognito /oauth2/token 端点

javascript axios oauth2 example#oauth2

javascript axios oauth2 example#oauth2