AWS CloudFront部署应用后Google登录回调指向AWS IP而非域名问题
解决Google登录回调地址指向EC2域名的问题
问题根源
Laravel未正确识别CloudFront转发的真实请求域名,导致Socialite生成的Google回调URL使用了EC2内部域名而非自定义域名,进而触发InvalidStateException。stateless()模式用于解决无状态认证的Session问题,和回调地址生成逻辑无关,因此无法解决该问题。
解决方案
配置CloudFront转发关键请求头
- 进入AWS CloudFront控制台,找到对应分发的行为设置。
- 在「缓存键与源请求」中,配置自定义源请求策略,转发以下请求头至EC2:
HostX-Forwarded-ProtoX-Forwarded-Host
- 保存配置后等待CloudFront部署生效。
让Laravel信任CloudFront代理
- 编辑
config/trustedproxy.php,将CloudFront的IP段添加到proxies数组(生产环境建议使用官方公布的CloudFront IP范围,而非*):'proxies' => [ '13.248.0.0/18', // 示例CloudFront IP段,需替换为实际范围 ], 'headers' => Illuminate\Http\Request::HEADER_X_FORWARDED_ALL, - 测试阶段可临时在
.env中设置:TRUSTED_PROXIES=*
- 编辑
强制Laravel使用自定义域名生成URL
- 在
.env中设置正确的应用域名:APP_URL=https://your-custom-domain.com - 确保
config/app.php中的url配置读取该环境变量:'url' => env('APP_URL', 'http://localhost'),
- 在
显式指定Google回调地址
- 编辑
config/services.php,为Google服务配置明确的回调URL,避免依赖自动生成:'google' => [ 'client_id' => env('GOOGLE_CLIENT_ID'), 'client_secret' => env('GOOGLE_CLIENT_SECRET'), 'redirect' => env('GOOGLE_REDIRECT_URI', 'https://your-custom-domain.com/auth/google/callback'), ], - 同时在Google开发者控制台的OAuth 2.0设置中,将该回调地址添加至授权回调列表。
- 编辑
优化后的Socialite代码(可选)
配置生效后,无需保留stateless()(若业务不需要无状态认证):
public function redirectGoogleLogin() { return Socialite::driver('google')->redirect(); } public function callbackGoogleLogin() { $socialUser = Socialite::driver('google')->user(); // 后续业务逻辑 }
内容的提问来源于stack exchange,提问作者Shams Ticon
相关产品推荐
相关产品推荐

