当前位置:首页 > PHP

php实现oauth

2026-02-27 18:51:19PHP

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 流程

若需手动实现,核心步骤包括:

  1. 注册应用
    在目标平台(如 Google、Facebook)注册应用,获取 client_idclient_secret

  2. 生成授权链接
    构造授权 URL,包含 client_idredirect_uriscopestate 参数:

    php实现oauth

    $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));
  3. 处理回调
    用户授权后,服务端通过 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);
  4. 访问资源
    使用 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),避免频繁重新授权。

    php实现oauth

  • 错误处理
    检查 API 响应的 error 字段,处理如 invalid_grantexpired_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

标签: phpoauth
分享给朋友:

相关文章

php 实现自动收货

php 实现自动收货

PHP 实现自动收货功能 自动收货功能通常用于电商系统,在订单超过一定时间未手动确认收货时自动完成订单。以下是实现方法: 数据库设计 需要订单表包含以下关键字段: CREATE TABLE…

php长连接实现

php长连接实现

PHP 长连接实现方法 长连接(Keep-Alive)允许客户端与服务器在一次TCP连接中发送和接收多个HTTP请求/响应,减少重复建立连接的开销。以下是PHP中实现长连接的几种方式: 配置HT…

php 购物车实现

php 购物车实现

数据库设计 购物车功能通常需要设计数据库表存储商品和用户信息。常见的表包括products(商品表)、users(用户表)和cart(购物车表)。cart表通常包含字段:id(主键)、user_id(…

php 实现验证码

php 实现验证码

使用 PHP 生成验证码 验证码(CAPTCHA)用于防止自动化脚本提交表单,以下是几种常见的 PHP 实现方法。 使用 GD 库生成图片验证码 GD 库是 PHP 的图像处理扩展,可用于生成验证码…

php验证码的实现

php验证码的实现

PHP 验证码实现方法 使用 GD 库生成基础验证码 创建画布并生成随机字符串作为验证码内容: session_start(); $width = 120; $height = 40; $imag…

php 实现排序

php 实现排序

PHP 实现数组排序的方法 PHP 提供了多种内置函数和方法来实现数组排序,适用于不同的排序需求。以下是一些常见的排序实现方式: 使用 sort() 函数对数组进行升序排序 sort() 函数对数…