Problema de proxy Nginx oauth2 (https-> http)
-
Ao implementar a autenticação do usuário no ambiente oficial do sistema recentemente, ocorreu um problema ao fazer login. No ambiente de desenvolvimento local, tudo está normal, mas um servidor colocaria falha de autenticação, revise o log encontrado
OAuth2
osredirectUri
parâmetros não correspondem -
O entendimento é por meio do springboot, por meio
UrlUtils.buildFullRequestUrl(request)
daHttpServletRequest
aquisição deredirectUri
:
OAuth2LoginAuthenticationFilter
String redirectUri = UriComponentsBuilder.fromHttpUrl(UrlUtils.buildFullRequestUrl(request))
.replaceQuery(null)
.build()
.toUriString();
- Configure o servidor
nginx
como um servidor proxy reverso, o que resulta emSpring
, você não consegue corrigirscheme
ehost
, o que levou aredirectUri
não corresponder corretamente para que a autenticação falhou.
Resolva o problema
1: Primeiro, o protocolo HTTP do proxy de encaminhamento de https, para oferecer suporte a vários domínios, e definir o valor do protocolo springboot Tomcat do cabeçalho https: "https" é https
** Nginx **
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
Tomcat
- 1. Se for Tomcat incorporado em springboot, application.yml deve ser configurado com os seguintes parâmetros
server:
tomcat:
remote-ip-header: "X-Forwarded-For"
protocol-header: "X-Forwarded-Proto"
protocol-header-https-value: "https
- 2. Se for Tomcat, basta configurar os seguintes parâmetros
<Engine >
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="X-Forwarded-For"
protocolHeader="X-Forwarded-Proto"
protocolHeaderHttpsValue="https"/>
</Engine >
O que resolveu isso? Claro, preste atenção à última etapa. ,
Basta prestar atenção ao prefixo do proxy Nginx: por exemplo, sou https://craywen.top/pms
Ao fazer proxy para http://127.0.0.1:8099 por meio de rota de correspondência pms nginx (^ ~ / pms)
Preste atenção nisso, depois que o código redirectUri
trará pms, existem duas soluções
1: Configure o URL de redirecionamento no Nginx
rewrite ^/user/(.*)$ /$1 break;
proxy_pass http://user;
2: Adicionar / pms à lista de permissões de oauth2
- Consulte https://www.jianshu.com/p/cf0056c64fa4