如何使用仅具有一个身份提供者的重写规则在反向代理后面使用Spring Security进行身份验证代码流

问题描述 投票:0回答:1

这不是问题,而是有关我如何解决问题的报告。特别是重定向uri的问题使我有些头疼。

一段时间以来,我们正在开发一个使用Spring Security OAuth2来针对外部身份提供者对用户进行身份验证的应用程序。该应用程序部署在Kubernetes集群上,其入口将重写URL。

两个主要问题是

  1. 会议。验证码流需要在服务器端处于状态。
  2. 重定向网址。重定向网址需要考虑反向代理的路径]

    如果应用程序不知道它在反向代理后面,则在检查重定向URL时会遇到问题。

    1. 应用程序-302-> idp redirecturl = ... / v2 /回调

    2. idp -302->反向代理... / v2 /回调

    3. 反向代理->应用程序... /回调

    4. Spring针对... /回调检查重定向URL ... / v2 /回调,并且验证失败,并带有[invalid_redirect_uri_parameter]

  3. 只有一个身份提供者,我们不想显示一个页面来选择身份提供者

设置看起来像这样:

入口

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: {{ .Chart.Name }}
  namespace: {{ .Values.namespace }}
  annotations:
    kubernetes.io/ingress.class: "nginx"
    # 1
    nginx.ingress.kubernetes.io/affinity: cookie
    nginx.ingress.kubernetes.io/session-cookie-path: /v2
    nginx.ingress.kubernetes.io/affinity-mode: persistent
    # 2
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: $1
    # 3
    nginx.ingress.kubernetes.io/x-forwarded-prefix: /v2
spec:
  rules:
    - host: {{ .Values.domain }}
      http:
        paths:
          - path: "/v2(.*)"
            backend:
              serviceName: myService
              servicePort: somePort

application.yml

server:
  # 4 
  forward-headers-strategy: framework
spring:
  security:
    oauth2:
      client:
        registration:
          myIdp:
            client-authentication-method: basic
            authorization-grant-type: authorization_code
            # 5
            redirect-uri: "{baseUrl}/oauth2/callback/code/{registrationId}"
            scope:
              - openid
              - email  

WebSecurityConfigurerAdapter

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
        .antMatchers(securedPage)
        .authenticated()
        .oauth2Login()
            // 6
            .loginPage("/oauth2/authorization/myidp")
            .redirectionEndpoint()
                // 7
                .baseUri("/oauth2/callback/code/myidp");
}

兴趣点

1)粘性会话,可将请求发送回正确的窗格

2)删除前缀的重写规则

3)注释,指示nginx添加x-forwarded-prefix标头

4)配置Spring Boot以处理反向代理标头

5)重定向URL需要考虑反向代理。在配置中,我们不需要关心。 Spring会自动执行此操作

6a),此配置阻止显示IDP选择,因为我们只有一个IDP,我们可以直接重定向到idp的授权端点。这是一种解决方法,将来可能会解决。

6b)另外,此配置还需要考虑反向代理,但是Spring也可以处理。

7)此处相同。没有反向代理路径

希望这对某人有帮助。

spring-security-oauth2 nginx-ingress
1个回答
0
投票

问题是答案(Q&A)

© www.soinside.com 2019 - 2024. All rights reserved.