php实现oauth
PHP 实现 OAuth 2.0
OAuth 2.0 是一种授权框架,允许第三方应用在用户授权下访问其资源服务器上的数据。PHP 可以通过多种方式实现 OAuth 2.0,以下是常见方法:
使用现有库
推荐使用成熟的 OAuth 2.0 客户端库,例如 league/oauth2-client:
composer require league/oauth2-client
示例代码(以 GitHub 为例):
use League\OAuth2\Client\Provider\Github;
$provider = new Github([
'clientId' => 'your-client-id',
'clientSecret' => 'your-client-secret',
'redirectUri' => 'https://your-redirect-uri',
]);
if (!isset($_GET['code'])) {
$authUrl = $provider->getAuthorizationUrl();
$_SESSION['oauth2state'] = $provider->getState();
header('Location: ' . $authUrl);
exit;
} elseif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) {
unset($_SESSION['oauth2state']);
exit('Invalid state');
} else {
$token = $provider->getAccessToken('authorization_code', [
'code' => $_GET['code']
]);
$user = $provider->getResourceOwner($token);
echo $user->getId();
}
手动实现 OAuth 2.0 流程
若需手动实现,核心步骤包括:
-
注册应用
在目标平台(如 Google、Facebook)注册应用,获取client_id和client_secret。 -
生成授权链接
构造授权 URL,包含client_id、redirect_uri、scope和state参数:
$authUrl = "https://provider.com/oauth/authorize?response_type=code" . "&client_id=YOUR_CLIENT_ID" . "&redirect_uri=" . urlencode('YOUR_REDIRECT_URI') . "&scope=read" . "&state=" . bin2hex(random_bytes(16)); -
处理回调
用户授权后,服务端通过code换取access_token:$tokenUrl = "https://provider.com/oauth/token"; $params = [ 'grant_type' => 'authorization_code', 'code' => $_GET['code'], 'redirect_uri' => 'YOUR_REDIRECT_URI', 'client_id' => 'YOUR_CLIENT_ID', 'client_secret' => 'YOUR_CLIENT_SECRET' ]; $response = file_get_contents($tokenUrl, false, stream_context_create([ 'http' => ['method' => 'POST', 'header' => 'Content-Type: application/x-www-form-urlencoded', 'content' => http_build_query($params)] ])); $token = json_decode($response, true); -
访问资源
使用access_token调用 API:$apiUrl = "https://provider.com/api/user"; $context = stream_context_create([ 'http' => ['header' => "Authorization: Bearer {$token['access_token']}"] ]); $userData = json_decode(file_get_contents($apiUrl, false, $context), true);
注意事项
-
安全性
始终验证state参数,防止 CSRF 攻击。避免在客户端存储client_secret。 -
令牌管理
实现令牌刷新逻辑(使用refresh_token),避免频繁重新授权。
-
错误处理
检查 API 响应的error字段,处理如invalid_grant或expired_token等情况。
常用 OAuth 2.0 服务商配置
-
Google
授权端点:https://accounts.google.com/o/oauth2/auth
令牌端点:https://oauth2.googleapis.com/token -
Facebook
授权端点:https://www.facebook.com/v12.0/dialog/oauth
令牌端点:https://graph.facebook.com/v12.0/oauth/access_token -
Microsoft
授权端点:https://login.microsoftonline.com/common/oauth2/v2.0/authorize
令牌端点:https://login.microsoftonline.com/common/oauth2/v2.0/token






