Laravel Socialite
简介
除了典型的基于表单的身份认证外,Laravel 还使用 Laravel Socialite 提供了简单便捷的方式进行 OAuth 认证。社会化登录目前支持 Facebook,Twitter,LinkedIn,Google,GitHub 和 Bitbucket。
其它平台的适配器列在社区驱动的 Socialite Providers 网站上。
安装
要使用社会化登录,可以使用 Composer 将扩展包添加到项目依赖中:
composer require laravel/socialite
配置
使用社会化登录前,需要为应用使用的 OAuth 服务添加凭证。这些凭证应放在 config/services.php
配置文件中,并且根据应用需要的提供者使用对应的 facebook
,twitter
,linkedin
,google
,github
或 bitbucket
键。例如:
'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
方法时,注意别传递任何保留的关键词,例如state
或response_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);