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 OAuth 为例):
require 'vendor/autoload.php';
use League\OAuth2\Client\Provider\Github;
$provider = new Github([
'clientId' => 'YOUR_CLIENT_ID',
'clientSecret' => 'YOUR_CLIENT_SECRET',
'redirectUri' => '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 'Hello ' . $user->getName();
}
手动实现 OAuth 2.0
如果希望手动实现 OAuth 2.0,需处理授权码流程:
-
获取授权码
重定向用户到 OAuth 提供商的授权端点:$authUrl = 'https://provider.com/oauth/authorize?' . http_build_query([ 'response_type' => 'code', 'client_id' => 'YOUR_CLIENT_ID', 'redirect_uri' => 'YOUR_REDIRECT_URI', 'state' => bin2hex(random_bytes(16)) ]); header('Location: ' . $authUrl); -
交换访问令牌
用户授权后,使用授权码换取访问令牌:$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' ]; $ch = curl_init($tokenUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params)); $response = curl_exec($ch); $token = json_decode($response, true); -
访问受保护资源
使用令牌调用 API:$apiUrl = 'https://provider.com/api/user'; $headers = [ 'Authorization: Bearer ' . $token['access_token'] ]; $ch = curl_init($apiUrl); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $userData = curl_exec($ch); echo $userData;
注意事项
-
安全性
始终验证state参数,防止 CSRF 攻击。
使用 HTTPS 保护通信。 -
令牌存储
避免将令牌存储在客户端,优先使用服务端会话或数据库。 -
刷新令牌
如果支持刷新令牌,需定期更新访问令牌。
通过以上方法,可以高效地在 PHP 中实现 OAuth 2.0 授权流程。






