为何Spring授权服务器重定向URI用127.0.0.1而非localhost?
在参考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
相关产品推荐
相关产品推荐

