本文目录导读:

我来详细介绍 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']
]));
推荐的开发流程
- 选择平台:明确需要支持哪些社交平台
- 申请应用:在各平台开发者中心创建应用
- 配置回调 URL:设置正确的回调域名和路径
- 安装 SDK:使用 Composer 安装合适的库
- 实现登录流程:
- 登录页面选择平台
- 重定向到第三方授权页
- 处理回调并获取用户信息
- 绑定或创建用户账户
- 设置会话和登录状态
- 测试:测试各个平台的完整流程
- 部署:确保生产环境正确配置
这样就能实现完整的社交登录功能了,建议从 Google + Facebook 开始,然后根据需求增加其他平台。