Laravel Socialite
简介
除了传统的基于表单的登录认证外,Laravel 还可以通过 Laravel Socialite 提供 OAuth 认证,目前支持的认证驱动包括 Facebook、Twitter、Google、LinkedIn、GitHub 和 Bitbucket。
注:其他平台的驱动可以在社区驱的 Socialite 提供者网站上找到。
升级 Socialite
升级到最新版本的 Socialite 时,需要仔细阅读升级指南。
安装
要使用 Socialite,首先需要通过 Composer 安装扩展包:
$ composer require laravel/socialite
配置
在使用 Socialite 之前,还需要为应用用到的 OAuth 服务添加认证信息,这些认证信息位于配置文件 config/services.php,而且对应 key 必须为facebook
、twitter
、linkedin
、google
、github
、gitlab
或 bitbucket
,配置哪些 key 取决于应用需要的提供者。例如:
'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 访问 Socialite :
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Laravel\Socialite\Facades\Socialite;
class LoginController extends Controller
{
/**
* Redirect the user to the GitHub authentication page.
*
* @return \Illuminate\Http\Response
*/
public function redirectToProvider()
{
return Socialite::driver('github')->redirect();
}
/**
* Obtain the user information from 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
方法的时候,注意不要传递保留关键字作为数组的 key,例如 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 方法可用于禁止会话状态验证。这在添加 Socialite 认证到某个 API 时很有用:
return Socialite::driver('google')->stateless()->user();
注:无状态认证对 Twitter 驱动无效,因为它使用的是 OAuth 1.0 认证。
获取用户信息
有了用户实例之后,就可以获取更多用户详情:
$user = Socialite::driver('github')->user();
// OAuth Two Providers
$token = $user->token;
$refreshToken = $user->refreshToken; // not always provided
$expiresIn = $user->expiresIn;
// OAuth One Providers
$token = $user->token;
$tokenSecret = $user->tokenSecret;
// All Providers
$user->getId();
$user->getNickname();
$user->getName();
$user->getEmail();
$user->getAvatar();
从 Token(OAuth2)中获取用户信息
如果我们已经有了某个用户的有效访问token,就可以使用 userFromToken
方法获取其信息:
$user = Socialite::driver('github')->userFromToken($token);
从 Token(OAuth1)和 Secret 中获取用户信息
如果已经有了某个用户的有效 token/secret,就可以使用 userFromTokenAndSecret
方法获取其信息:
$user = Socialite::driver('twitter')->userFromTokenAndSecret($token, $secret);