Skip to content
赞助商赞助商赞助商
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待

Laravel Socialite

介绍

除了典型的基于表单的认证,Laravel 还提供了一种简单、方便的方法来使用 Laravel Socialite 进行 OAuth 提供者的认证。Socialite 目前支持与 Facebook、Twitter、LinkedIn、Google、GitHub、GitLab 和 Bitbucket 的认证。

NOTE

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

升级 Socialite

在升级到 Socialite 的新主要版本时,务必仔细查看 升级指南

安装

要开始使用 Socialite,请使用 Composer 将该包添加到项目的依赖项中:

php
composer require laravel/socialite

配置

在使用 Socialite 之前,您还需要为应用程序使用的 OAuth 服务添加凭据。这些凭据应放置在 config/services.php 配置文件中,并应使用 facebooktwitterlinkedingooglegithubgitlabbitbucket 作为键,具体取决于应用程序所需的提供者。例如:

php
'github' => [
    'client_id' => env('GITHUB_CLIENT_ID'),
    'client_secret' => env('GITHUB_CLIENT_SECRET'),
    'redirect' => 'http://your-callback-url',
],

NOTE

如果 redirect 选项包含相对路径,它将自动解析为完全限定的 URL。

路由

接下来,您可以开始认证用户了!您需要两个路由:一个用于将用户重定向到 OAuth 提供者,另一个用于在认证后从提供者接收回调。我们将使用 Socialite facade 访问 Socialite:

php
<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
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 方法将读取传入请求并从提供者检索用户的信息。

您需要为控制器方法定义路由:

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

可选参数

许多 OAuth 提供者支持在重定向请求中使用可选参数。要在请求中包含任何可选参数,请使用关联数组调用 with 方法:

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

NOTE

使用 with 方法时,请注意不要传递任何保留关键字,如 stateresponse_type

访问范围

在重定向用户之前,您还可以使用 scopes 方法在请求中添加额外的“范围”。此方法将合并所有现有范围与您提供的范围:

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

您可以使用 setScopes 方法覆盖所有现有范围:

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

无状态认证

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

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

NOTE

无状态认证不适用于使用 OAuth 1.0 进行认证的 Twitter 驱动程序。

检索用户详情

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

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

// OAuth 二次提供者
$token = $user->token;
$refreshToken = $user->refreshToken; // 并不总是提供
$expiresIn = $user->expiresIn;

// OAuth 一次提供者
$token = $user->token;
$tokenSecret = $user->tokenSecret;

// 所有提供者
$user->getId();
$user->getNickname();
$user->getName();
$user->getEmail();
$user->getAvatar();

从令牌检索用户详情 (OAuth2)

如果您已经拥有用户的有效访问令牌,可以使用 userFromToken 方法检索其详细信息:

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

从令牌和密钥检索用户详情 (OAuth1)

如果您已经拥有用户的有效令牌/密钥对,可以使用 userFromTokenAndSecret 方法检索其详细信息:

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