karlhsu/socialite

A OAuth2 authentication tool for international social platforms

v0.1.0-beta 2025-05-27 10:39 UTC

This package is auto-updated.

Last update: 2025-05-27 10:47:04 UTC


README

一个简单易用的 PHP OAuth2.0 社交登录包,支持多个社交平台。

支持的平台

  • Facebook
  • Instagram
  • Discord
  • YouTube
  • Telegram

安装

composer require karlxu/socialite

配置

在使用之前,你需要在各个社交平台注册应用并获取相应的密钥:

Facebook

  1. 访问 Facebook Developers
  2. 创建新应用
  3. 获取 App ID 和 App Secret
  4. 配置 OAuth 重定向 URL

Instagram

  1. 访问 Facebook Developers
  2. 创建新应用
  3. 添加 Instagram Basic Display 产品
  4. 获取 App ID 和 App Secret
  5. 配置 OAuth 重定向 URL

Discord

  1. 访问 Discord Developer Portal
  2. 创建新应用
  3. 获取 Client ID 和 Client Secret
  4. 配置 OAuth2 重定向 URL

YouTube

  1. 访问 Google Cloud Console
  2. 创建新项目
  3. 启用 YouTube Data API v3
  4. 创建 OAuth 2.0 客户端 ID
  5. 获取 Client ID 和 Client Secret
  6. 配置重定向 URL

Telegram

  1. 通过 @BotFather 创建新机器人
  2. 获取 Bot Token
  3. 配置域名和重定向 URL

权限范围(Scopes)

每个平台都支持自定义权限范围,以下是各平台支持的权限:

Facebook

  • email - 访问用户的邮箱地址
  • public_profile - 访问用户的公开资料
  • user_friends - 访问用户的好友列表
  • user_posts - 访问用户的帖子
  • user_photos - 访问用户的照片
  • user_videos - 访问用户的视频

Instagram

  • user_profile - 访问用户的基本资料
  • user_media - 访问用户的媒体内容

Discord

  • identify - 访问用户的基本信息
  • email - 访问用户的邮箱地址
  • guilds - 访问用户的服务器列表
  • guilds.join - 允许机器人将用户添加到服务器

YouTube

  • https://www.googleapis.com/auth/youtube.readonly - 只读访问 YouTube 数据
  • https://www.googleapis.com/auth/userinfo.email - 访问用户邮箱
  • https://www.googleapis.com/auth/userinfo.profile - 访问用户资料
  • https://www.googleapis.com/auth/youtube.force-ssl - 完全访问 YouTube 数据

Telegram

  • user - 访问用户的基本信息

使用示例

基本使用

use Karlxu\Socialite\SocialiteManager;

$config = [
    'facebook' => [
        'client_id' => 'your-facebook-client-id',
        'client_secret' => 'your-facebook-client-secret',
        'redirect' => 'http://localhost/callback',
        'scopes' => ['email', 'public_profile'],
    ],
    'instagram' => [
        'client_id' => 'your-instagram-client-id',
        'client_secret' => 'your-instagram-client-secret',
        'redirect' => 'http://localhost/callback',
        'scopes' => ['user_profile', 'user_media'],
    ],
    'discord' => [
        'client_id' => 'your-discord-client-id',
        'client_secret' => 'your-discord-client-secret',
        'redirect' => 'http://localhost/callback',
        'scopes' => ['identify', 'email'],
    ],
    'youtube' => [
        'client_id' => 'your-youtube-client-id',
        'client_secret' => 'your-youtube-client-secret',
        'redirect' => 'http://localhost/callback',
        'scopes' => [
            'https://www.googleapis.com/auth/youtube.readonly',
            'https://www.googleapis.com/auth/userinfo.email',
            'https://www.googleapis.com/auth/userinfo.profile'
        ],
    ],
    'telegram' => [
        'client_id' => 'your-telegram-client-id',
        'client_secret' => 'your-telegram-client-secret',
        'redirect' => 'http://localhost/callback',
        'scopes' => ['user'],
    ],
];

$socialite = new SocialiteManager($config);

重定向到授权页面

// 重定向到 Facebook 授权页面
$url = $socialite->driver('facebook')->redirect();
header('Location: ' . $url);

// 重定向到 Instagram 授权页面
$url = $socialite->driver('instagram')->redirect();
header('Location: ' . $url);

// 重定向到 Discord 授权页面
$url = $socialite->driver('discord')->redirect();
header('Location: ' . $url);

// 重定向到 YouTube 授权页面
$url = $socialite->driver('youtube')->redirect();
header('Location: ' . $url);

// 重定向到 Telegram 授权页面
$url = $socialite->driver('telegram')->redirect();
header('Location: ' . $url);

处理回调

// 处理 Facebook 回调
$user = $socialite->driver('facebook')->userFromCode($_GET['code']);
echo $user->getId();        // 用户 ID
echo $user->getName();      // 用户名称
echo $user->getEmail();     // 用户邮箱
echo $user->getAvatar();    // 用户头像
echo $user->getNickname();  // 用户昵称
print_r($user->getRaw());   // 原始数据

// 处理 Instagram 回调
$user = $socialite->driver('instagram')->userFromCode($_GET['code']);
echo $user->getId();        // 用户 ID
echo $user->getNickname();  // 用户昵称
echo $user->getName();      // 用户名称
print_r($user->getRaw());   // 原始数据

// 处理 Discord 回调
$user = $socialite->driver('discord')->userFromCode($_GET['code']);
echo $user->getId();        // 用户 ID
echo $user->getNickname();  // 用户昵称
echo $user->getName();      // 用户名称
echo $user->getEmail();     // 用户邮箱
echo $user->getAvatar();    // 用户头像
echo $user->getRaw()['discriminator'];  // 用户标识符
echo $user->getRaw()['verified'];       // 是否已验证

// 处理 YouTube 回调
$user = $socialite->driver('youtube')->userFromCode($_GET['code']);
echo $user->getId();        // 用户 ID
echo $user->getName();      // 用户名称
echo $user->getEmail();     // 用户邮箱
echo $user->getAvatar();    // 用户头像
echo $user->getRaw()['channel_id'];        // 频道 ID
echo $user->getRaw()['channel_title'];     // 频道标题
echo $user->getRaw()['subscriber_count'];  // 订阅者数量
echo $user->getRaw()['video_count'];       // 视频数量

// 处理 Telegram 回调
$user = $socialite->driver('telegram')->userFromCode($_GET['code']);
echo $user->getId();        // 用户 ID
echo $user->getNickname();  // 用户昵称
echo $user->getName();      // 用户名称
echo $user->getAvatar();    // 用户头像
echo $user->getRaw()['auth_date'];  // 认证时间
echo $user->getRaw()['hash'];       // 认证哈希

使用访问令牌

// 使用访问令牌获取用户信息
$user = $socialite->driver('facebook')->userFromToken('access-token');

高级用法

自定义 HTTP 客户端

use GuzzleHttp\Client;

$client = new Client([
    'timeout' => 5.0,
    'verify' => false,
]);

$socialite->driver('facebook')->setHttpClient($client);

自定义作用域

// 设置 Facebook 作用域
$socialite->driver('facebook')->scopes(['email', 'public_profile']);

// 设置 Instagram 作用域
$socialite->driver('instagram')->scopes(['user_profile', 'user_media']);

// 设置 Discord 作用域
$socialite->driver('discord')->scopes(['identify', 'email']);

// 设置 YouTube 作用域
$socialite->driver('youtube')->scopes(['https://www.googleapis.com/auth/youtube.readonly']);

测试

composer test

贡献

欢迎提交 Pull Request 或创建 Issue。

许可证

MIT