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

Laravel 社交登录

介绍

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

NOTE

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

安装

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

php
composer require laravel/socialite

接下来,在 config/app.php 配置文件中注册 Laravel\Socialite\SocialiteServiceProvider

php
'providers' => [
    // 其他服务提供者...

    Laravel\Socialite\SocialiteServiceProvider::class,
],

同时,将 Socialite facade 添加到 app 配置文件的 aliases 数组中:

php
'Socialite' => Laravel\Socialite\Facades\Socialite::class,

配置

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

php
'github' => [
    'client_id' => env('GITHUB_CLIENT_ID'),         // 您的 GitHub 客户端 ID
    'client_secret' => env('GITHUB_CLIENT_SECRET'), // 您的 GitHub 客户端密钥
    'redirect' => 'http://your-callback-url',
],

NOTE

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

路由

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

php
<?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 方法将读取传入的请求并从提供商处检索用户的信息。

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

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

检索用户详情

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

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

从令牌检索用户详情

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

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