首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无状态弹簧安全oauth2提供程序

无状态弹簧安全oauth2提供程序
EN

Stack Overflow用户
提问于 2016-07-07 13:42:14
回答 2查看 5.2K关注 0票数 12

我想建立一个基于spring、security和spring-oauth2的简单OAuth2提供程序。

我在一个实例机器上完成了所有工作:对于OAuth2授权,用户被发送到/oauth/authorize。大多数用户没有登录,因此通过spring安全性将它们重定向到/login,然后返回t /oauth/authorize以完成授权。

在默认配置中,spring安全使用会话id在用户浏览器中设置cookie,并将会话数据存储在内存中。

代码语言:javascript
复制
public static class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .and()
            .formLogin()
            .loginPage("/login")
            .permitAll();
    }
[...]

为了在不放松用户会话的情况下启用负载平衡和蓝绿色部署,我必须执行以下步骤:

  • 禁用服务器端会话-对于只负责OAuth2授权的API,我认为没有必要为会话创建共享数据库。
  • 相反,启用一个包含用户身份验证的remember cookie,这在授权期间是暂时的。
  • /login重定向的重定向url存储在不同的位置,
    • 是否可以将其存储在登录表单或用户cookie中?或者什么是“无会话”的替代方案?

  • 禁用CSRF (我知道如何做到这一点,oauth2有auth_codes,我认为它有类似的目的。)(只是为了完整。)

这种方法有意义吗?有什么变化是必要的?

EN

回答 2

Stack Overflow用户

发布于 2016-11-27 17:24:44

这是一个典型的分布式会话存储问题。首先,“会话”(会话is和cookie)与“无状态”相结合的概念是一种矛盾。

OAuth2应该是一个“无状态”委托授权框架(),前提是在生成访问代码之前,将初始输入请求(包括重定向url)持久化在服务器端。

在接收凭据之前将这些详细信息泄露给cookie可能会使您受到安全漏洞的攻击。您可以通过确保cookie是HttpOnly (JS无法访问)和secure (仅通过httpS发布)来降低风险,但无论如何,我不会推荐这种方法。

关于另一点:Security的“记住-我”特性被设计为只带有对身份验证凭据的引用,而不是对初始auth2请求的详细信息。此外,默认情况下,持久化选项(PersistentTokenBasedRememberMeServices)只支持内存(单节点)和jdbc风格。

调整这些以满足你的需要将需要相当大的改变。可行,但需要付出很大的努力。

根据我的经验,我想到了两种选择:

  1. 使用前端负载均衡器(例如: haproxy、nginx、F5等…)配置粘性会话。。用户会话将绑定到提交凭据的节点。这意味着,如果该节点出现故障,用户将不得不重新身份验证才能创建新的访问令牌,但是如果对其他节点使用,那么已经给出的访问令牌应该是可以的。
  2. 配置/实现了一个透明的分布式web会话存储,一些分布式内存存储提供者(如: hazelcast )为应用服务器配置了插件,使其对用户透明。这上面隐含了一些额外的开销,但是几乎不需要额外的代码来满足您的需求。
票数 2
EN

Stack Overflow用户

发布于 2016-07-20 21:35:13

  1. 在用户登录到您的提供者之后,您将生成一个授权代码,该代码被发送到客户端应用程序(通过重定向(回调) url)。
  2. 稍后,客户端应用程序向服务器请求获取访问令牌。在这个请求中,它提供了自动化代码。
  3. 此时,您需要能够将客户端应用程序发送的授权代码与您首先生成的授权代码进行比较。这是您需要共享内存的地方。

如果您查看协议section-4.1的这一部分,就需要C点和D点之间的共享内存。

这在服务器之外的任何内容中都无法实现,因为这是验证客户端应用程序已被授权的点。

进程后面的访问和刷新令牌也是类似的情况。

对于登录步骤(A和B点),在登录表单中有重定向url (和客户端状态-参见-4.1节)看起来很好。如果这是唯一使用会话的地方--那么您可以摆脱它。但是,授权代码仍然需要共享内存(共享数据库)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38247068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档