简介

除了典型的基于表单的身份验证之外,Laravel 还提供了一种使用 Laravel Socialite对 OAuth providers 进行身份验证的简单方便的方法。 Socialite 目前支持 Facebook,Twitter,LinkedIn,Google,GitHub,GitLab 和 Bitbucket 的身份验证。

技巧:其他平台的驱动器可以在 Socialite Providers 社区驱动网站查找。

安装

在开始使用 Socialite 之前,通过 Composer 软件包管理器将软件包添加到项目的依赖项中:

  1. composer require laravel/socialite

升级

升级到 Socialite 的新主要版本时,请务必仔细查看 the upgrade guide.

配置

在使用 Socialite 之前,你需要为应用程序使用的OAuth提供程序添加凭据。通常,可以通过在要验证的服务的仪表板中创建“开发人员应用程序”来检索这些凭据。

这些凭证应该放在你的 php config/services.php 配置文件中, 并且应该使用 php facebook, php twitter (OAuth 1.0), php twitter-oauth-2 (OAuth 2.0), php linkedin, php google, php github, php gitlab, 或者 php bitbucket, 取决于应用程序所需的提供商:

  1. 'github' => [
  2. 'client_id' => env('GITHUB_CLIENT_ID'),
  3. 'client_secret' => env('GITHUB_CLIENT_SECRET'),
  4. 'redirect' => 'http://example.com/callback-url',
  5. ],

技巧:如果 php redirect 项的值包含一个相对路径,它将会自动解析为全称 URL。

认证

路由

要使用 OAuth 提供程序对用户进行身份验证,你需要两个路由:一个用于将用户重定向到 OAuth provider,另一个用于在身份验证后接收来自 provider 的回调。下面的示例控制器演示了这两个路由的实现:

  1. use Laravel\Socialite\Facades\Socialite;
  2. Route::get('/auth/redirect', function () {
  3. return Socialite::driver('github')->redirect();
  4. });
  5. Route::get('/auth/callback', function () {
  6. $user = Socialite::driver('github')->user();
  7. // $user->token
  8. });

php redirect 提供的方法 php Socialite facade 负责将用户重定向到 OAuth provider,而该 user 方法将读取传入的请求并在身份验证后从提供程序中检索用户的信息。

身份验证和存储

从 OAuth 提供程序检索到用户后,你可以确定该用户是否存在于应用程序的数据库中并验证用户。如果用户在应用程序的数据库中不存在,通常会在数据库中创建一条新记录来代表该用户:

  1. use App\Models\User;
  2. use Illuminate\Support\Facades\Auth;
  3. use Laravel\Socialite\Facades\Socialite;
  4. Route::get('/auth/callback', function () {
  5. $githubUser = Socialite::driver('github')->user();
  6. $user = User::updateOrCreate([
  7. 'github_id' => $githubUser->id,
  8. ], [
  9. 'name' => $githubUser->name,
  10. 'email' => $githubUser->email,
  11. 'github_token' => $githubUser->token,
  12. 'github_refresh_token' => $githubUser->refreshToken,
  13. ]);
  14. Auth::login($user);
  15. return redirect('/dashboard');
  16. });

技巧:有关特定 OAuth 提供商提供哪些用户信息的更多信息,请参阅有关 检索用户详细信息 的文档。

访问作用域

在重定向用户之前,你还可以使用 php scopes 方法在请求中添加其他「作用域」。此方法会将所有现有作用域与你提供的作用域合并:

  1. use Laravel\Socialite\Facades\Socialite;
  2. return Socialite::driver('github')
  3. ->scopes(['read:user', 'public_repo'])
  4. ->redirect();

你可以使用 php setScopes 方法覆盖所有现有范围:

  1. return Socialite::driver('github')
  2. ->setScopes(['read:user', 'public_repo'])
  3. ->redirect();

可选参数

许多 OAuth providers 支持重定向请求中的可选参数。 要在请求中包含任何可选参数,请使用关联数组调用 php with 方法:

  1. use Laravel\Socialite\Facades\Socialite;
  2. return Socialite::driver('google')
  3. ->with(['hd' => 'example.com'])
  4. ->redirect();

注意:使用 php with 方法时, 注意不要传递任何保留的关键字,例如 php statephp response_type

检索用户详细信息

在将用户重定向回你的身份验证回调路由之后,你可以使用 Socialite 的 php user 方法检索用户的详细信息。php user 方法为返回的用户对象提供了各种属性和方法,你可以使用这些属性和方法在你自己的数据库中存储有关该用户的信息。

你可以使用不同的属性和方法这取决于要进行身份验证的 OAuth 提供程序是否支持 OAuth 1.0 或 OAuth 2.0:

  1. use Laravel\Socialite\Facades\Socialite;
  2. Route::get('/auth/callback', function () {
  3. $user = Socialite::driver('github')->user();
  4. // OAuth 2.0 providers...
  5. $token = $user->token;
  6. $refreshToken = $user->refreshToken;
  7. $expiresIn = $user->expiresIn;
  8. // OAuth 1.0 providers...
  9. $token = $user->token;
  10. $tokenSecret = $user->tokenSecret;
  11. // All providers...
  12. $user->getId();
  13. $user->getNickname();
  14. $user->getName();
  15. $user->getEmail();
  16. $user->getAvatar();
  17. });

从令牌中检索用户详细信息 (OAuth2)
如果你已经有了一个用户的有效访问令牌,你可以使用 Socialite 的 php userFromToken 方法检索其详细信息:

  1. use Laravel\Socialite\Facades\Socialite;
  2. $user = Socialite::driver('github')->userFromToken($token);

从令牌中检索用户详细信息 (OAuth2)
如果你已经有了一对有效的用户令牌/秘钥,你可以使用 Socialite 的 php userFromTokenAndSecret 方法检索他们的详细信息:

  1. use Laravel\Socialite\Facades\Socialite;
  2. $user = Socialite::driver('twitter')->userFromTokenAndSecret($token, $secret);

无认证状态
php stateless 方法可用于禁用会话状态验证。 这在向 API 添加社交身份验证时非常有用:

  1. use Laravel\Socialite\Facades\Socialite;
  2. return Socialite::driver('google')->stateless()->user();

注意:Twitter 驱动程序不支持无状态身份验证,它使用 OAuth 1.0 进行身份验证