You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Spring授权服务器重定向URI用127.0.0.1而非localhost?

问题原因分析:127.0.0.1与localhost在Spring Authorization Server中的差异

在参考Spring Authorization Server示例时,发现示例中客户端重定向URI配置使用127.0.0.1:

redirect-uris:
  - "http://127.0.0.1:1234/login/oauth2/code/my-webapp-client-oidc"
  - "http://127.0.0.1:1234/authorized"
post-logout-redirect-uris:
  - "http://127.0.0.1:1234/logged-out"

而替换为localhost后:

redirect-uris:
  - "http://localhost:1234/login/oauth2/code/my-webapp-client-oidc"
  - "http://localhost:1234/authorized"
post-logout-redirect-uris:
  - "http://localhost:1234/logged-out"

登录时授权服务器抛出org.springframework.security.access.AccessDeniedException: Access Denied异常。

核心原因:重定向URI的严格匹配规则

Spring Authorization Server遵循OAuth2协议的安全要求,客户端请求中的重定向URI必须与授权服务器配置的重定向URI完全一致,包括主机名部分。

当你用localhost访问客户端应用时,浏览器发起的授权请求中携带的重定向URI会使用localhost作为主机名,但授权服务器配置的是127.0.0.1,两者主机名不匹配,授权服务器会判定该重定向URI未被客户端授权,直接返回权限拒绝。

为什么127.0.0.1和localhost不被视为等价?

虽然在本地环境中两者都指向本机,但从OAuth2的安全设计逻辑来看,它们是两个独立的主机标识:

  • 授权服务器不会自动将这两个主机名做等价映射,除非你显式配置允许(比如使用通配符,但生产环境不推荐)
  • 部分系统中localhost会被解析为IPv6地址[::1],这会进一步导致重定向URI的主机部分完全不匹配

解决方法

  • 统一主机名:客户端访问地址和授权服务器配置的重定向URI使用同一个主机名,要么全用127.0.0.1,要么全用localhost
  • 同时支持两者:在授权服务器的客户端配置中,同时添加包含127.0.0.1和localhost的重定向URI条目

内容的提问来源于stack exchange,提问作者Erando

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 23:33:23