简介 除了典型的基于表单的身份验证之外,Laravel 还提供了一种使用 Laravel 社会化登录 对 OAuth providers 进行身份验证的简单方便的方法。Socialite 目前支持 Facebook,Twitter,LinkedIn,Google,GitHub,GitLab 和 Bitbucket 的身份验证。 技巧:其他平台的驱动器可以在 Socialite Providers 社区驱动网站查找。 升级社会化登录 升级到 Socialite 的新主要版本时,请务必仔细查看 升级指南。 安装 在开始使用社会化登录功能之前,通过 Composer 将 laravel/socialite 包添加到你的项目依赖里面: ``` composer require laravel/socialite ``` 配置 在使用 Socialite 之前,您还需要为应用程序使用的 OAuth 服务添加凭据。这些凭证应该放在你的 config/services.php 配置文件中,并且应该使用 facebook, twitter, linkedin, google, github, gitlab 或 bitbucket 作为键名,取决于您的应用程序所需的提供商。例如: ``` 'github' => [ 'client_id' => env('GITHUB_CLIENT_ID'), 'client_secret' => env('GITHUB_CLIENT_SECRET'), 'redirect' => 'http://your-callback-url', ], ``` 技巧:如果 redirect 项的值包含一个相对路径,它将会自动解析为全称 URL。 路由 接下来,就要对用户认证了!这需要两个路由:一个路由用于把用户重定向到 OAuth provider,另一个则用于在认证完成后接收相应 provider 的回调请求。可以通过 Socialite facade 的方式来访问 Socialite: ``` <?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Laravel\Socialite\Facades\Socialite; class LoginController extends Controller { /** * 将用户重定向到 GitHub 的授权页面 * * @return \Illuminate\Http\Response */ public function redirectToProvider() { return Socialite::driver('github')->redirect(); } /** * 从 GitHub 获取用户信息 * * @return \Illuminate\Http\Response */ public function handleProviderCallback() { $user = Socialite::driver('github')->user(); // $user->token; } } ``` redirect 方法负责将用户发送到 OAuth provider,而 user 方法将读取传入请求并从 provider 中检索用户信息。 当然,还需要在你的控制器方法中定义好路由规则: ``` use App\Http\Controllers\Auth\LoginController; Route::get('login/github', [LoginController::class, 'redirectToProvider']); Route::get('login/github/callback', [LoginController::class, 'handleProviderCallback']); ``` 可选参数 许多 OAuth providers 支持重定向请求中的可选参数。 要在请求中包含任何可选参数,请使用关联数组调用 with 方法: ``` return Socialite::driver('google') ->with(['hd' => 'example.com']) ->redirect(); ``` 注意:注意:使用 with 方法时,注意不要传递任何保留的关键字,例如 state 或 response_type 。 访问作用域 在重定向用户之前,您还可以使用 scopes 方法在请求中添加其他「作用域」。 此方法将所有现有范围与您提供的范围合并: ``` return Socialite::driver('github') ->scopes(['read:user', 'public_repo']) ->redirect(); ``` 你可以使用 setScopes 方法覆盖所有现有范围: ``` return Socialite::driver('github') ->setScopes(['read:user', 'public_repo']) ->redirect(); ``` 无认证状态 stateless 方法可用于禁用会话状态验证。 这在向 API 添加社交身份验证时非常有用: ``` return Socialite::driver('google')->stateless()->user(); ``` 注意:Twitter 驱动程序不支持无状态身份验证,它使用 OAuth 1.0 进行身份验证。 获取用户实例 有了用户实例之后,你就可以获取更多用户详情: ``` $user = Socialite::driver('github')->user(); // OAuth2 Providers $token = $user->token; $refreshToken = $user->refreshToken; // 有时会被提供 $expiresIn = $user->expiresIn; // OAuth1 Providers $token = $user->token; $tokenSecret = $user->tokenSecret; // 所有 Providers $user->getId(); $user->getNickname(); $user->getName(); $user->getEmail(); $user->getAvatar(); ``` 从令牌中检索用户的详细信息 (OAuth2) 如果你已经有了一个用户的有效访问令牌,你可以使用 userFromToken 方法来检索用户的详细信息: ``` $user = Socialite::driver('github')->userFromToken($token); ``` 从令牌和秘钥中检索用户的详细信息 (OAuth1) 如果你已经有了一对有效的用户令牌 / 秘钥,你可以使用 userFromTokenAndSecret 方法来检索他们的详细信息: ``` $user = Socialite::driver('twitter')->userFromTokenAndSecret($token, $secret); ```