Laravel Socialite

简介

除了典型的基于表单的身份认证外,Laravel 还使用 Laravel Socialite 提供了简单便捷的方式进行 OAuth 认证。社会化登录目前支持 Facebook,Twitter,LinkedIn,Google,GitHub 和 Bitbucket。

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

安装

要使用社会化登录,可以使用 Composer 将扩展包添加到项目依赖中:

composer require laravel/socialite

配置

使用社会化登录前,需要为应用使用的 OAuth 服务添加凭证。这些凭证应放在 config/services.php 配置文件中,并且根据应用需要的提供者使用对应的 facebooktwitterlinkedingooglegithubbitbucket 键。例如:

'github' => [
    'client_id' => env('GITHUB_CLIENT_ID'),         // Your GitHub Client ID
    'client_secret' => env('GITHUB_CLIENT_SECRET'), // Your GitHub Client Secret
    'redirect' => 'http://your-callback-url',
],

如果 redirect 选项包含一个相对路径,它会被自动解析为完整的 URL。

路由

接下来,就可以认证用户了!需要两个路由:一个用于将用户重定向到 OAuth 提供者,另一个用于认证后接收来自提供者的回调。我们会使用 Socialite Facade 获取社会化登录:

namespace App\Http\Controllers\Auth;

use 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 提供者,而 user 方法会读取传入请求并从提供者获取用户的信息。

当然,您需要在定义到控制器方法的路由:

Route::get('login/github', 'Auth\LoginController@redirectToProvider');
Route::get('login/github/callback', 'Auth\LoginController@handleProviderCallback');

可选参数

一些 OAuth 提供者支持在重定向请求中添加可选的参数。想要在请求中包含任何可选参数,可以在调用 with 方法时使用关联数组:

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

当使用 with 方法时,注意别传递任何保留的关键词,例如 stateresponse_type

访问作用域

在重定向用户之前,还可以使用 scopes 方法在请求中添加额外的「作用域」。此方法会将所有已有作用域和您提供的进行合并:

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

You can overwrite all existing scopes using the setScopes method:

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

无状态身份认证

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

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

获取用户详情

有了用户实例后,就可以获取有关用户的更多详细信息了:

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

// OAuth1 提供者
$token = $user->token;
$refreshToken = $user->refreshToken; // not always provided
$expiresIn = $user->expiresIn;

// OAuth2 提供者
$token = $user->token;
$tokenSecret = $user->tokenSecret;

// 所有 OAuth 提供者
$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);