gpt4 book ai didi

spring-mvc - 无状态的 Spring Security oauth2 提供者

转载 作者:行者123 更新时间:2023-12-04 12:52:39 24 4
gpt4 key购买 nike

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

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

在默认配置中,spring-security 在用户浏览器中设置一个带有 session-id 的 cookie,并将 session 数据存储在内存中。

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

为了在不丢失用户 session 的情况下启用负载平衡和蓝绿部署,(我认为)我必须执行以下步骤:
  • 禁用服务器端 session - 对于只负责 OAuth2 授权的 API,我认为没有必要为 session 提供共享数据库。
  • 相反,在授权期间临时启用包含用户身份验证的记住我的 cookie。
  • 存储 /login 的重定向 URL重定向到不同的地方
  • 是否可以将其存储在登录表单或用户 cookie 中?或者什么是“无 session ”的替代方案?
  • 禁用 CSRF(我知道怎么做,并且 oauth2 有 auth_codes,我认为它们有类似的目的。只是为了完整性。)

  • 这种方法有意义吗?哪些改变是必要的?

    最佳答案

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

  • 如果您查看协议(protocol)的这一部分 section-4.1您需要点 C 和 D 之间的共享内存。
    这无法通过您的服务器之外的任何东西来实现,因为这是您验证客户端应用程序是否被授权的地方。
    稍后在流程中访问和刷新 token 的情况类似。
    对于登录步骤(点 A 和 B) - 在登录表单中包含重定向 url(和客户端状态 - 参见第 4.1 节)看起来很好。如果这是唯一使用 session 的地方 - 你可以摆脱它。但是您仍然需要共享内存(共享数据库)作为授权代码。

    关于spring-mvc - 无状态的 Spring Security oauth2 提供者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38247068/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com