ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
* * * * * [TOC] ## 简介 除了典型的基于表单的认证之外, Laravel 同时提供一种简单便捷的方式授权通过 OAuth providers 使用 [Laravel Socialite](https://github.com/laravel/socialite)。 社会化登录现在支持通过 Facebook、 Twitter、 LinkedIn、 Google、GitHub 和 Bitbucket 授权。 > {提示}其他平台的驱动器可以在 [Socialite Providers](https://socialiteproviders.github.io/) 社区驱动网站查找。 ## 安装 在开始使用社会化登录功能之前,通过 Composer 将 laravel/socialite 包添加到你的项目依赖里面: ~~~ composer require laravel/socialite ~~~ ## 配置 使用 Socialite 前,需要先添加上应用程序所使用的 OAuth 服务的凭证。凭证应该保存在配置文件 `config/services.php` 当中,可使用的键名有 `facebook`、`twitter`、 `linkedin`、 `google`、 `github`或 `bitbucket`,要根据你应用程序需要的提供器来确定键名。例如: ~~~ 'github' => [ 'client_id' => env('GITHUB_CLIENT_ID'), // 你的 GitHub Client ID 'client_secret' => env('GITHUB_CLIENT_SECRET'), // 你的 GitHub Client Secret 'redirect' => 'http://your-callback-url', ], ~~~ > {tip} 如果 `redirect` 项的值是个相对路径,它会自动解析为全称 URL 。 ## 路由 接下来,就要对用户认证了!这需要两个路由:一个路由用于把用户重定向到 OAuth 提供器,另一个则用于在认证完成后接收相应提供器的回调请求。可以通过 facade 方式 `Socialite` 来访问 Socialite: ~~~ <?php 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(); ~~~ > {note} 当使用 `with` 方法时,意不要传递保留关键字,比如 `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` 方法可用于禁止会话状态验证。这个方法在向 API 添加社会化身份验证时非常有用。 ~~~ return Socialite::driver('google')->stateless()->user(); ~~~ ## 获取用户实例 有了用户实例之后,就可以获取更多用户详情: ~~~ $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(); ~~~ #### 从令牌中检索用户详细信息(OAuth2) 如果你已经有了一个用户的有效访问令牌,你可以使用 `userFromToken` 方法检索用户的详细信息。 ~~~ $user = Socialite::driver('github')->userFromToken($token); ~~~ #### 从令牌和秘钥中检索用户详细信息(OAuth1) 如果你已经有了一个有效的用户令牌 / 秘钥,你可以使用 `userFromTokenAndSecret` 方法检索他们的详细信息: ~~~ $user = Socialite::driver('twitter')->userFromTokenAndSecret($token, $secret); ~~~