PHP 怎么社交登录集成

wen PHP项目 1

本文目录导读:

PHP 怎么社交登录集成

  1. 使用现成的 PHP 库
  2. 各类平台的接入配置
  3. 完整的登录流程示例
  4. 数据库表设计
  5. 安全注意事项
  6. 推荐的开发流程

我来详细介绍 PHP 社交登录集成的几种主流方案和实现步骤:

使用现成的 PHP 库

最流行的方案:HybridAuth

composer require hybridauth/hybridauth
<?php
require_once 'vendor/autoload.php';
use Hybridauth\Hybridauth;
$config = [
    'callback' => 'https://yoursite.com/callback.php',
    'providers' => [
        'Google' => [
            'enabled' => true,
            'keys' => [
                'id' => 'GOOGLE_CLIENT_ID',
                'secret' => 'GOOGLE_CLIENT_SECRET'
            ],
        ],
        'Facebook' => [
            'enabled' => true,
            'keys' => [
                'id' => 'FACEBOOK_APP_ID',
                'secret' => 'FACEBOOK_APP_SECRET'
            ],
        ],
        'GitHub' => [
            'enabled' => true,
            'keys' => [
                'id' => 'GITHUB_CLIENT_ID',
                'secret' => 'GITHUB_CLIENT_SECRET'
            ],
        ],
        'WeChat' => [
            'enabled' => true,
            'keys' => [
                'id' => 'WECHAT_APP_ID',
                'secret' => 'WECHAT_APP_SECRET'
            ],
        ],
    ],
];
// 登录页面
$hybridauth = new Hybridauth($config);
$adapter = $hybridauth->authenticate('Google');
$userProfile = $adapter->getUserProfile();
echo "登录成功:{$userProfile->displayName}";

使用 Laravel Socialite(Laravel 框架)

composer require laravel/socialite
// routes/web.php
Route::get('/auth/redirect', function () {
    return Socialite::driver('google')->redirect();
});
Route::get('/auth/callback', function () {
    $user = Socialite::driver('google')->user();
    // 处理用户数据
    $userData = [
        'name' => $user->getName(),
        'email' => $user->getEmail(),
        'avatar' => $user->getAvatar(),
        'provider' => 'google',
        'provider_id' => $user->getId(),
    ];
    // 保存或登录用户
    $user = User::updateOrCreate(
        ['email' => $userData['email']],
        $userData
    );
    Auth::login($user);
    return redirect('/home');
});

各类平台的接入配置

Google 登录

// Google API Console 获取
// OAuth 2.0 客户端 ID 和密钥
use Hybridauth\Hybridauth;
$config = [
    'callback' => 'https://yoursite.com/login/google/callback',
    'providers' => [
        'Google' => [
            'enabled' => true,
            'keys' => [
                'id' => '客户端ID',
                'secret' => '客户端密钥'
            ],
            'scope' => 'email profile',
            'authorize_url_parameters' => [
                'prompt' => 'select_account',
                'access_type' => 'offline'
            ]
        ]
    ]
];

微信登录

// 使用第三方库或直接调用微信 API
use Overtrue\Socialite\SocialiteManager;
// 微信开放平台配置
$config = [
    'wechat' => [
        'client_id' => 'AppID',
        'client_secret' => 'AppSecret',
        'redirect' => 'https://yoursite.com/login/wechat/callback',
        'scopes' => ['snsapi_login'],
    ],
];
$socialite = new SocialiteManager($config);
$user = $socialite->driver('wechat')->user();

GitHub 登录

// GitHub OAuth Apps 配置
$config = [
    'providers' => [
        'GitHub' => [
            'enabled' => true,
            'keys' => [
                'id' => 'CLIENT_ID',
                'secret' => 'CLIENT_SECRET'
            ],
            'scope' => 'user:email',
        ]
    ]
];

完整的登录流程示例

<?php
// login.php - 选择社交平台
session_start();
$providers = ['google', 'facebook', 'github', 'wechat'];
?>
<!DOCTYPE html>
<html>
<head>社交登录</title>
</head>
<body>
    <h2>登录</h2>
    <div>
        <?php foreach ($providers as $provider): ?>
            <button onclick="window.location='auth.php?provider=<?php echo $provider; ?>'">
                使用 <?php echo ucfirst($provider); ?> 登录
            </button>
        <?php endforeach; ?>
    </div>
</body>
</html>
<?php
// auth.php - 处理登录请求
session_start();
require_once 'vendor/autoload.php';
use Hybridauth\Hybridauth;
$provider = $_GET['provider'] ?? '';
// 配置文件(包含所有平台配置)
$config = require 'config/socialite.php';
if (!isset($config['providers'][ucfirst($provider)])) {
    die('不支持的登录方式');
}
$hybridauth = new Hybridauth($config);
try {
    $adapter = $hybridauth->authenticate(ucfirst($provider));
    $userProfile = $adapter->getUserProfile();
    // 处理用户数据
    $userData = [
        'email' => $userProfile->email,
        'name' => $userProfile->displayName,
        'avatar' => $userProfile->photoURL,
        'provider' => $provider,
        'provider_id' => $userProfile->identifier,
    ];
    // 连接主账户或注册新用户
    $userId = linkUserToAccount($userData);
    // 设置会话
    $_SESSION['user_id'] = $userId;
    $_SESSION['user_name'] = $userData['name'];
    header('Location: dashboard.php');
    exit;
} catch (\Exception $e) {
    echo "登录失败: " . $e->getMessage();
}
function linkUserToAccount($userData) {
    // 检查是否已存在此社交账号用户
    $stmt = $pdo->prepare("SELECT user_id FROM social_accounts 
                           WHERE provider = ? AND provider_id = ?");
    $stmt->execute([$userData['provider'], $userData['provider_id']]);
    $result = $stmt->fetch();
    if ($result) {
        return $result['user_id'];
    }
    // 根据 email 查找已有用户
    if ($userData['email']) {
        $stmt = $pdo->prepare("SELECT id FROM users WHERE email = ?");
        $stmt->execute([$userData['email']]);
        $user = $stmt->fetch();
        if ($user) {
            // 绑定社交账号到现有用户
            linkSocialAccount($user['id'], $userData);
            return $user['id'];
        }
    }
    // 创建新用户
    $pdo->beginTransaction();
    try {
        $stmt = $pdo->prepare("INSERT INTO users (name, email, avatar) VALUES (?, ?, ?)");
        $stmt->execute([$userData['name'], $userData['email'], $userData['avatar']]);
        $userId = $pdo->lastInsertId();
        linkSocialAccount($userId, $userData);
        $pdo->commit();
        return $userId;
    } catch (Exception $e) {
        $pdo->rollBack();
        throw $e;
    }
}

数据库表设计

-- 用户表
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    email VARCHAR(255) UNIQUE,
    avatar VARCHAR(500),
    password VARCHAR(255),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 社交账号关联表
CREATE TABLE social_accounts (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    provider VARCHAR(50) NOT NULL,  -- google, facebook, github, wechat
    provider_id VARCHAR(255) NOT NULL,  -- 社交平台的用户ID
    email VARCHAR(255),
    name VARCHAR(255),
    avatar VARCHAR(500),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id),
    UNIQUE KEY unique_social (provider, provider_id)
);

安全注意事项

// 验证回调状态(防止 CSRF)
if (isset($_GET['state']) && $_GET['state'] !== $_SESSION['oauth_state']) {
    die('Invalid state parameter');
}
// 验证回调地址
$allowedDomain = 'yourdomain.com';
if (parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST) !== $allowedDomain) {
    die('Invalid referer');
}
// 使用 HTTPS 加密传输
// CSP 安全策略
header("Content-Security-Policy: default-src 'self' https://accounts.google.com");
// 日志记录
error_log("Social login attempt: " . json_encode([
    'provider' => $provider,
    'timestamp' => date('Y-m-d H:i:s'),
    'ip' => $_SERVER['REMOTE_ADDR']
]));

推荐的开发流程

  1. 选择平台:明确需要支持哪些社交平台
  2. 申请应用:在各平台开发者中心创建应用
  3. 配置回调 URL:设置正确的回调域名和路径
  4. 安装 SDK:使用 Composer 安装合适的库
  5. 实现登录流程
    • 登录页面选择平台
    • 重定向到第三方授权页
    • 处理回调并获取用户信息
    • 绑定或创建用户账户
    • 设置会话和登录状态
  6. 测试:测试各个平台的完整流程
  7. 部署:确保生产环境正确配置

这样就能实现完整的社交登录功能了,建议从 Google + Facebook 开始,然后根据需求增加其他平台。

抱歉,评论功能暂时关闭!