第三方登录解决方案: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 必须为facebooktwitterlinkedingooglegithubbitbucket,配置哪些 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',
],

上述 GITHUB_CLIENT_IDGITHUB_CLIENT_SECRET 可以通过在 https://github.com/settings/developers 页面新增 OAuth 应用获取到:

此外,应用的表单信息也要按照自己的应用正确填写:

注:如果 redirect 配置项包含的是相对路径,系统会自动将其转化为完整 URL。

路由

接下来,准备开始认证用户!你需要两个路由:一个用于重定向用户到 OAuth 提供者,另一个用于认证后获取来自提供者的回调。我们使用 Socialite 门面访问 Socialite :

<?php

namespace App\Http\Controllers\Auth;

use Socialite;

class LoginController extends Controller
{
    /**
     * 将用户重定向到Github认证页面
     *
     * @return Response
     */
    public function redirectToProvider()
    {
        return Socialite::driver('github')->redirect();
    }

    /**
     * 从Github获取用户信息.
     *
     * @return Response
     */
    public function handleProviderCallback()
    {
        $user = Socialite::driver('github')->user();

        //dd($user->token);
    }
}

redirect 方法将用户发送到 OAuth 提供者,user 方法读取请求信息并从提供者中获取用户信息。

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

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

这样,我们在访问 login/github 路由时,页面就会跳转到 Github 认证界面:

登录授权之后,页面就会重定向到 login/github/callback 页面打印用户信息:

可选参数

很多 OAuth 提供者在重定向请求中支持可选参数,要在请求中包含可选参数,可以通过一个关联数组调用 with 方法:

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

注:使用 with 方法的时候,注意不要传递保留关键字作为数组的 key,例如 stateresponse_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();

获取用户信息

有了用户实例之后,就可以获取更多用户详情:

$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();

获取用户信息后,我们可以将其保存到 users 数据表,然后使用 Auth::login 方法将用户登录到应用。下次同一用户使用 Github 登录,我们从提供者获取用户信息后先通过 github_id 从数据库中查找该用户,找到后即登录。

从 Token(OAuth2)中获取用户信息

如果你已经有了某个用户的有效访问令牌,就可以使用 userFromToken 方法获取其信息:

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

从 Token(OAuth1)和 Secret 中获取用户信息

如果你已经有了某个用户的有效 token/secret,就可以使用 userFromTokenAndSecret 方法获取其信息:

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

Vote Vote Cancel Collect Collect Cancel

<< 上一篇: 全文搜索解决方案:Laravel Scout

>> 下一篇: 本地开发调试解决方案:Laravel Telescope