当前位置: 首页> 最新文章列表> PHP OAuth2授权:构建授权码授权服务器的完整指南

PHP OAuth2授权:构建授权码授权服务器的完整指南

M66 2025-06-21

PHP OAuth2授权:构建授权码授权服务器的完整指南

OAuth 是一种开放标准,允许第三方应用安全地访问用户的资源。在 OAuth2 中,授权码授权是最常见的授权类型。本文将详细介绍如何在 PHP 中构建一个授权码授权服务器,帮助你实现安全可靠的用户授权。

OAuth2 授权码流程概述

授权码授权流程如下:

  1. 客户端向授权服务器发起授权请求。
  2. 授权服务器验证用户身份并请求用户授权。
  3. 用户同意授权后,授权服务器向客户端发放授权码。
  4. 客户端使用授权码、客户端 ID 和客户端密钥等信息向授权服务器请求访问令牌。
  5. 授权服务器验证信息并发放访问令牌。
  6. 客户端使用访问令牌访问资源服务器获取用户的资源。

安装 PHP OAuth2 库

首先,安装一个流行的 PHP OAuth2 库。我们将使用 "bshaffer/oauth2-server-php" 这个库,它可以通过 Composer 安装:

composer require bshaffer/oauth2-server-php

创建授权服务器

接下来,我们在 PHP 中创建一个 `index.php` 文件,作为我们的授权码授权服务器:

<?php
require_once 'vendor/autoload.php';

// 创建 PDO 实例连接数据库
$dsn = "mysql:dbname=testdb;host=localhost";
$username = "root";
$password = "";
$pdo = new PDO($dsn, $username, $password);

// 创建 OAuth2 存储库实例
$storage = new OAuth2StoragePdo($pdo);

// 创建授权服务器实例
$server = new OAuth2Server($storage);

// 添加支持的授权类型
$server->addGrantType(new OAuth2GrantTypeAuthorizationCode($storage));

// 处理授权请求
$request = OAuth2Request::createFromGlobals();
$response = new OAuth2Response();

if (!$server->validateAuthorizeRequest($request, $response)) {
    $response->send();
    die();
}

// 显示授权页面
if (empty($_POST)) {
    exit('
        <form method="post">
            <label for="username">Username:</label>
            <input type="text" id="username" name="username"><br><br>
            <label for="password">Password:</label>
            <input type="password" id="password" name="password"><br><br>
            <input type="submit" value="Authorize">
        </form>
    ');
}

$is_authorized = ($_POST['username'] == 'admin' && $_POST['password'] == 'admin');

$server->handleAuthorizeRequest($request, $response, $is_authorized);

if ($is_authorized) {
    $response->send();
} else {
    echo '授权失败';
}

创建数据库表

现在,我们需要创建一个用于存储客户端信息的数据库表。在 MySQL 中执行以下 SQL 语句:

CREATE TABLE `oauth_clients` (
    `client_id` varchar(80) COLLATE utf8_unicode_ci NOT NULL,
    `client_secret` varchar(80) COLLATE utf8_unicode_ci NOT NULL,
    `redirect_uri` varchar(2000) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
    `grant_types` varchar(80) COLLATE utf8_unicode_ci DEFAULT NULL,
    `scope` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
    `user_id` varchar(80) COLLATE utf8_unicode_ci DEFAULT NULL,
    PRIMARY KEY (`client_id`)
);
  

测试授权码授权流程

访问以下 URL 进行授权:

http://localhost/index.php?response_type=code&client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REDIRECT_URI&scope=SCOPE
  

在授权页面输入用户名和密码(如:用户名和密码均为 "admin"),授权码将被返回。如果用户验证成功,服务器会返回一个授权码。

请求访问令牌

通过 curl 或其他 HTTP 客户端,使用获取到的授权码来请求访问令牌:

curl -X POST -d "grant_type=authorization_code&code=AUTHORIZATION_CODE&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&redirect_uri=YOUR_REDIRECT_URI" http://localhost/token.php
  

将授权码、客户端 ID、客户端密钥和重定向 URI 替换为实际值。如果请求成功,你将获得访问令牌。

总结

以上就是如何在 PHP 中创建一个授权码授权服务器的完整过程。通过使用 OAuth2,你可以为你的应用程序实现安全的授权流程,保护用户的数据隐私。