Skip to content
赞助商
虚位以待
赞助商
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待

Laravel Socialite

介绍

除了典型的基于表单的认证,Laravel 还提供了一种简单、方便的方法来使用 Laravel Socialite 进行 OAuth 提供者认证。Socialite 目前支持与 Facebook、Twitter、LinkedIn、Google、GitHub、GitLab 和 Bitbucket 的认证。

NOTE

其他平台的适配器列在社区驱动的 Socialite Providers 网站上。

安装

要开始使用 Socialite,请使用 Composer 包管理器将该包添加到项目的依赖项中:

php
composer require laravel/socialite

升级 Socialite

在升级到 Socialite 的新主版本时,务必仔细查看升级指南

配置

在使用 Socialite 之前,您需要为应用程序使用的 OAuth 提供者添加凭据。这些凭据应放置在应用程序的 config/services.php 配置文件中,并应使用 facebooktwitterlinkedingooglegithubgitlabbitbucket 作为键,具体取决于应用程序所需的提供者:

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

NOTE

如果 redirect 选项包含相对路径,它将自动解析为完全限定的 URL。

认证

路由

要使用 OAuth 提供者认证用户,您需要两个路由:一个用于将用户重定向到 OAuth 提供者,另一个用于在认证后从提供者接收回调。下面的示例控制器演示了这两个路由的实现:

php
use Laravel\Socialite\Facades\Socialite;

Route::get('/auth/redirect', function () {
    return Socialite::driver('github')->redirect();
});

Route::get('/auth/callback', function () {
    $user = Socialite::driver('github')->user();

    // $user->token
});

Socialite facade 提供的 redirect 方法负责将用户重定向到 OAuth 提供者,而 user 方法将在用户认证后读取传入请求并从提供者检索用户的信息。

认证与存储

一旦从 OAuth 提供者检索到用户,您可以确定用户是否存在于应用程序的数据库中并认证用户。如果用户不存在于应用程序的数据库中,通常会在数据库中创建一个新记录来表示用户:

php
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Laravel\Socialite\Facades\Socialite;

Route::get('/auth/callback', function () {
    $githubUser = Socialite::driver('github')->user();

    $user = User::where('github_id', $githubUser->id)->first();

    if ($user) {
        $user->update([
            'github_token' => $githubUser->token,
            'github_refresh_token' => $githubUser->refreshToken,
        ]);
    } else {
        $user = User::create([
            'name' => $githubUser->name,
            'email' => $githubUser->email,
            'github_id' => $githubUser->id,
            'github_token' => $githubUser->token,
            'github_refresh_token' => $githubUser->refreshToken,
        ]);
    }

    Auth::login($user);

    return redirect('/dashboard');
});

NOTE

有关特定 OAuth 提供者可用的用户信息的更多信息,请查阅检索用户详情的文档。

访问范围

在将用户重定向之前,您还可以使用 scopes 方法向认证请求添加额外的“范围”。此方法将合并所有现有范围与您提供的范围:

php
use Laravel\Socialite\Facades\Socialite;

return Socialite::driver('github')
    ->scopes(['read:user', 'public_repo'])
    ->redirect();

您可以使用 setScopes 方法覆盖认证请求上的所有现有范围:

php
return Socialite::driver('github')
    ->setScopes(['read:user', 'public_repo'])
    ->redirect();

可选参数

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

php
use Laravel\Socialite\Facades\Socialite;

return Socialite::driver('google')
    ->with(['hd' => 'example.com'])
    ->redirect();

NOTE

使用 with 方法时,请注意不要传递任何保留关键字,如 stateresponse_type

检索用户详情

在用户被重定向回您的认证回调路由后,您可以使用 Socialite 的 user 方法检索用户的详细信息。user 方法返回的用户对象提供了多种属性和方法,您可以使用这些属性和方法在自己的数据库中存储有关用户的信息。根据您正在认证的 OAuth 提供者是否支持 OAuth 1.0 或 OAuth 2.0,可能会提供不同的属性和方法:

php
use Laravel\Socialite\Facades\Socialite;

Route::get('/auth/callback', function () {
    $user = Socialite::driver('github')->user();

    // OAuth 2.0 提供者...
    $token = $user->token;
    $refreshToken = $user->refreshToken;
    $expiresIn = $user->expiresIn;

    // OAuth 1.0 提供者...
    $token = $user->token;
    $tokenSecret = $user->tokenSecret;

    // 所有提供者...
    $user->getId();
    $user->getNickname();
    $user->getName();
    $user->getEmail();
    $user->getAvatar();
});

从令牌检索用户详情 (OAuth2)

如果您已经拥有用户的有效访问令牌,可以使用 Socialite 的 userFromToken 方法检索其详细信息:

php
use Laravel\Socialite\Facades\Socialite;

$user = Socialite::driver('github')->userFromToken($token);

从令牌和密钥检索用户详情 (OAuth1)

如果您已经拥有用户的有效令牌和密钥,可以使用 Socialite 的 userFromTokenAndSecret 方法检索其详细信息:

php
use Laravel\Socialite\Facades\Socialite;

$user = Socialite::driver('twitter')->userFromTokenAndSecret($token, $secret);

无状态认证

stateless 方法可用于禁用会话状态验证。这在为 API 添加社交认证时很有用:

php
use Laravel\Socialite\Facades\Socialite;

return Socialite::driver('google')->stateless()->user();

NOTE

无状态认证不适用于使用 OAuth 1.0 进行认证的 Twitter 驱动程序。