无国籍春季安全oauth2提供商

Jan*_*Jan 7 cookies oauth spring-mvc spring-security stateless

我想基于spring-boot,spring-security和spring-oauth2设置一个简单的OAuth2提供程序.

我在一台实例计算机上运行了一切:对于OAuth2授权,用户被发送到/oauth/authorize.大多数用户都没有登录,所以他们被/login弹簧安全重定向到然后返回/oauth/authorize以完成授权.

在默认配置中,spring-security使用session-id在用户的浏览器中设置cookie,并将会话数据存储在内存中.

public static class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .and()
            .formLogin()
            .loginPage("/login")
            .permitAll();
    }
[...]
Run Code Online (Sandbox Code Playgroud)

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

  • 禁用服务器端会话 - 对于仅负责OAuth2授权的API,我认为没有必要为会话建立共享数据库.
  • 相反,在授权期间启用包含用户身份验证的记住我的cookie.
  • 将重定向的重定向网址存储/login在其他位置
    • 是否可以将其存储在登录表单或用户cookie中?或者什么是"无会话"替代品?
  • 禁用CSRF(我知道如何做到这一点,oauth2有auth_codes,我认为它们具有类似的目的.只是为了完整性.)

这种方法有意义吗?需要做哪些改变?

小智 1

  1. 用户登录您的提供商后,您将生成一个授权代码,该代码将发送到客户端应用程序(通过重定向(回调)url)。

  2. 稍后,客户端应用程序向您的服务器发出请求以获取访问令牌。在此请求中,它提供授权代码。

  3. 此时,您需要能够将客户端应用程序发送的授权代码与您首先生成的授权代码进行比较。这就是你需要共享内存的地方。

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

使用服务器之外的任何东西都无法实现这一点,因为这是您验证客户端应用程序是否已授权的点。

此过程稍后的访问令牌和刷新令牌的情况与此类似。

对于登录步骤(A 点和 B 点) - 在登录表单中包含重定向 url(和客户端状态 - 请参阅第 4.1 节)看起来不错。如果这是唯一使用会话的地方 - 您可以将其删除。但您仍然需要共享内存(共享数据库)来存储授权代码。