Laravel Socialite如何配置多组Google OAuth凭证实现多域登录需求?
多域名Google登录实现方案
Laravel Socialite 完全支持传入多组不同的Google OAuth凭证适配多域名登录需求,常用实现方案有两种:
方案1:动态覆盖默认配置(适合域名数量较少的场景)
无需修改原有默认配置,只需在跳转登录和回调逻辑中,根据当前访问域名动态替换凭证参数即可。
- 先在
.env文件中添加多组域名对应的凭证:
# 域名1配置 GOOGLE_CLIENT_ID_DOMAIN1=xxx GOOGLE_CLIENT_SECRET_DOMAIN1=xxx GOOGLE_REDIRECT_URI_DOMAIN1=https://domain1.com/auth/google/callback # 域名2配置 GOOGLE_CLIENT_ID_DOMAIN2=xxx GOOGLE_CLIENT_SECRET_DOMAIN2=xxx GOOGLE_REDIRECT_URI_DOMAIN2=https://domain2.com/auth/google/callback
- 修改跳转登录逻辑:
public function redirect(){ $currentHost = request()->getHost(); // 按当前域名匹配对应凭证 $googleConfig = match($currentHost) { 'domain1.com' => [ 'client_id' => env('GOOGLE_CLIENT_ID_DOMAIN1'), 'client_secret' => env('GOOGLE_CLIENT_SECRET_DOMAIN1'), 'redirect' => env('GOOGLE_REDIRECT_URI_DOMAIN1'), ], 'domain2.com' => [ 'client_id' => env('GOOGLE_CLIENT_ID_DOMAIN2'), 'client_secret' => env('GOOGLE_CLIENT_SECRET_DOMAIN2'), 'redirect' => env('GOOGLE_REDIRECT_URI_DOMAIN2'), ], default => config('services.google') }; // 动态覆盖默认配置 config(['services.google' => $googleConfig]); return Socialite::driver('google') ->scopes(['https://apps-apis.google.com/a/feeds/groups/', \Google_Service_Directory::ADMIN_DIRECTORY_USER_READONLY]) ->stateless()->redirect(); }
- 回调逻辑中也要加入相同的动态配置逻辑,避免校验不通过:
public function callback(){ $currentHost = request()->getHost(); $googleConfig = match($currentHost) { 'domain1.com' => [ 'client_id' => env('GOOGLE_CLIENT_ID_DOMAIN1'), 'client_secret' => env('GOOGLE_CLIENT_SECRET_DOMAIN1'), 'redirect' => env('GOOGLE_REDIRECT_URI_DOMAIN1'), ], 'domain2.com' => [ 'client_id' => env('GOOGLE_CLIENT_ID_DOMAIN2'), 'client_secret' => env('GOOGLE_CLIENT_SECRET_DOMAIN2'), 'redirect' => env('GOOGLE_REDIRECT_URI_DOMAIN2'), ], default => config('services.google') }; config(['services.google' => $googleConfig]); $user = Socialite::driver('google')->stateless()->user(); // 后续自行处理登录逻辑 }
方案2:注册多组自定义驱动(适合域名较多、需长期维护的场景)
直接在服务提供者中注册多个对应不同域名的Google驱动,使用时按域名选择对应驱动即可。
- 在
App\Providers\AppServiceProvider.php的boot方法中注册自定义驱动:
public function boot() { // 注册域名1的Google驱动 Socialite::extend('google_domain1', function ($app) { $config = $app['config']['services.google_domain1']; return Socialite::buildProvider(\Laravel\Socialite\Two\GoogleProvider::class, $config); }); // 注册域名2的Google驱动 Socialite::extend('google_domain2', function ($app) { $config = $app['config']['services.google_domain2']; return Socialite::buildProvider(\Laravel\Socialite\Two\GoogleProvider::class, $config); }); }
- 在
config/services.php中添加多组配置:
return [ // 原有默认配置 'google' => [ 'client_id' => env('GOOGLE_CLIENT_ID'), 'client_secret' => env('GOOGLE_CLIENT_SECRET'), 'redirect' => env('GOOGLE_REDIRECT_URI'), ], // 域名1配置 'google_domain1' => [ 'client_id' => env('GOOGLE_CLIENT_ID_DOMAIN1'), 'client_secret' => env('GOOGLE_CLIENT_SECRET_DOMAIN1'), 'redirect' => env('GOOGLE_REDIRECT_URI_DOMAIN1'), ], // 域名2配置 'google_domain2' => [ 'client_id' => env('GOOGLE_CLIENT_ID_DOMAIN2'), 'client_secret' => env('GOOGLE_CLIENT_SECRET_DOMAIN2'), 'redirect' => env('GOOGLE_REDIRECT_URI_DOMAIN2'), ], ];
- 使用时按域名选择对应驱动即可:
public function redirect(){ $driver = match(request()->getHost()) { 'domain1.com' => 'google_domain1', 'domain2.com' => 'google_domain2', default => 'google' }; return Socialite::driver($driver) ->scopes(['https://apps-apis.google.com/a/feeds/groups/', \Google_Service_Directory::ADMIN_DIRECTORY_USER_READONLY]) ->stateless()->redirect(); }
注意事项
- 所有使用的回调地址都需要提前在Google Cloud控制台的OAuth凭证配置中加入授权重定向URI,否则会报
redirect_uri_mismatch错误。 - 若使用通配符域名,可以直接在Google控制台配置通配符回调地址,配合动态拼接redirect参数使用,不需要单独配置多组凭证,实现更简单。
内容的提问来源于stack exchange,提问作者chewie
相关产品推荐
相关产品推荐

