快速开始
Youyun 基于 OAuth 2.0 授权码模式,本文档帮助你快速接入。
前置条件
- 一个 Youyun 管理员账号
- 在管理后台创建的应用凭证(Client ID 和 Client Secret)
- 一个可接收回调的后端服务
API 基础地址
所有 API 请求的基础地址为:https://api.yun52.cn
例如授权地址为 https://api.yun52.cn/api/oauth.php,文档中的接口路径均相对于此地址。
1. 创建应用
登录管理后台(youyou.php),在「应用管理」中创建新应用,获得 Client ID 和 Client Secret。
2. 引导用户授权
$clientId = "你的Client ID";
$redirectUri = "https://your-app.com/callback";
$state = bin2hex(random_bytes(16));
$authUrl = "https://api.yun52.cn/api/oauth.php"
. "?action=authorize"
. "&client_id=" . urlencode($clientId)
. "&redirect_uri=" . urlencode($redirectUri)
. "&state=" . urlencode($state);
header("Location: " . $authUrl);
3. 处理回调
$code = $_GET['code'];
$state = $_GET['state'];
if ($state !== $_SESSION['oauth_state']) {
die('Invalid state');
}
4. 换取 Access Token
必须使用 POST 方法:
$postData = http_build_query([
'code' => $code,
'client_id' => $clientId,
'client_secret' => $clientSecret,
'redirect_uri' => $redirectUri,
]);
$ctx = stream_context_create(['http' => [
'method' => 'POST',
'header' => 'Content-Type: application/x-www-form-urlencoded',
'content' => $postData,
]]);
$response = json_decode(file_get_contents(
"https://api.yun52.cn/api/oauth.php?action=token",
false, $ctx
), true);
$accessToken = $response['access_token'];
5. 获取用户信息
支持 GET 和 POST:
$userInfo = json_decode(file_get_contents(
"https://api.yun52.cn/api/oauth.php?action=verify"
. "&access_token=" . urlencode($accessToken)
), true);
if ($userInfo['valid']) {
$userId = $userInfo['user']['id'];
$username = $userInfo['user']['username'];
$avatar = $userInfo['user']['avatar']; // base64 Data URI,空字符串表示未设置
}
授权流程
标准 OAuth 2.0 授权码模式流程:
[用户] → 点击登录 → [你的应用]
[你的应用] → 重定向到授权页 → [Youyun]
[Youyun] → 显示授权确认 → [用户]
[用户] → 确认授权 → [Youyun]
[Youyun] → 重定向 + code → [你的应用]
[你的应用] → 用 code 换 token → [Youyun]
[Youyun] → 返回 access_token → [你的应用]
安全说明
- state 参数:必须使用随机 state 防止 CSRF
- 授权码有效期:10 分钟,一次性使用
- Token 有效期:30 天
- HTTPS:生产环境必须使用 HTTPS
- Client Secret:必须保存在服务端
API 参考
授权接口
GET /api/oauth.php?action=authorize
| 参数 | 必填 | 说明 |
client_id | 是 | 应用 Client ID |
redirect_uri | 是 | 回调地址 |
state | 否 | 防 CSRF 随机字符串 |
scope | 否 | 权限范围,默认 basic |
Token 接口
POST /api/oauth.php?action=token
必须使用 POST 方法,参数通过 application/x-www-form-urlencoded 或 JSON body 传递,不支持 GET。
| 参数 | 必填 | 说明 |
code | 是 | 授权码 |
client_id | 是 | 应用 Client ID |
client_secret | 是 | 应用 Client Secret |
redirect_uri | 是 | 回调地址 |
{
"access_token": "a1b2c3d4...",
"token_type": "Bearer",
"expires_in": 2592000
}
验证接口
GET /api/oauth.php?action=verify
| 参数 | 必填 | 说明 |
access_token | 是 | 要验证的 Token |
{
"valid": true,
"user": { "id": "AbCdEf", "username": "zhangsan" }
}
获取用户信息
验证 Token 后可获取用户基本信息,包含头像:
GET /api/oauth.php?action=verify&access_token=YOUR_TOKEN
返回示例:
{
"valid": true,
"user": {
"id": "AbCdEfGhIjKl",
"username": "zhangsan",
"avatar": "data:image/jpeg;base64,/9j/4AAQ..."
},
"scope": "basic",
"expires_at": 1735689600
}
字段说明
| 字段 | 类型 | 说明 |
user.id | string | 用户唯一 ID |
user.username | string | 用户名 |
user.avatar | string | 头像(base64 Data URI),为空字符串表示未设置 |
头像处理建议
- 头像格式为
data:image/jpeg;base64,... 或 data:image/png;base64,...
- 可直接用于
<img src="..."> 标签
- 建议限制大小在 200KB 以内
- 如需裁剪/缩放,使用 Canvas API 处理后上传
- 头像为空时显示用户名首字母作为默认头像
取消授权接口
POST /api/openapi.php?action=revoke
| 参数 | 必填 | 说明 |
client_id | 是 | 应用 Client ID |
client_secret | 是 | 应用 Client Secret |
access_token | 是 | 要撤销的 Token |
查询授权状态
POST /api/openapi.php?action=check_auth
| 参数 | 必填 | 说明 |
client_id | 是 | 应用 Client ID |
client_secret | 是 | 应用 Client Secret |
user_id | 是 | 要查询的用户 ID |
公告接口
GET /api/admin.php?action=list_announcements
获取已启用的公告列表,无需管理员权限。返回公告数组,每项包含 id、title、content、type(info/warn/danger)、updated_at。
应用商店接口
GET /api/admin.php?action=store_apps
获取所有已启用的应用列表(不含 Secret),无需管理员权限。可用于展示应用商店。
授权模式
开放模式
默认模式,任何域名可发起授权请求,适合面向公众的服务。无需额外配置。
白名单模式
只允许白名单中的域名发起授权请求,适合企业内部系统。在管理后台「授权模式」中添加域名。不在白名单中的域名发起的授权请求会被拒绝,并提示用户联系管理员。
注册限制
可设置每个 IP 最多注册的账号数量,防止恶意注册。设为 0 不限制。超出限制后,该 IP 的注册请求会被拒绝。
IP 封禁
管理员可手动封禁 IP 地址,支持设置封禁时长(1小时/1天/7天/30天/永久)。登录尝试过多(10次/15分钟)会被自动封禁 1 小时。
二级管理
管理员可在「用户管理」中将用户设为二级管理员。二级管理员拥有独立管理后台,可创建应用和发布公告。
二级管理员创建的应用支持完整的 OAuth 2.0 授权码模式,第三方应用可使用二级应用的 Client ID 和 Client Secret 完成用户登录。
二级应用的 OAuth 流程与主应用完全一致:发起授权 → 用户确认 → 回调 code → 换取 token → 获取用户信息。区别在于二级应用的数据独立存储,主管理后台可查看所有二级管理数据。
二级管理员发布的公告仅展示给已授权其应用的用户。
SDK
提供 PHP 和 JavaScript SDK,简化接入流程。
PHP SDK
文件位置:sdk/youyun.php
require_once 'sdk/youyun.php';
\$youyun = new Youyun(
'https://api.yun52.cn',
'YOUR_CLIENT_ID',
'YOUR_CLIENT_SECRET'
);
// 获取授权 URL
\$authUrl = \$youyun->getAuthUrl('https://your-app.com/callback.php');
// 换取 Token
\$result = \$youyun->exchangeCode(\$_GET['code'], 'https://your-app.com/callback.php');
// 获取用户信息
\$user = \$youyun->getUserInfo(\$result['access_token']);
JavaScript SDK
文件位置:sdk/youyun.js
const youyun = new Youyun('https://api.yun52.cn', 'YOUR_CLIENT_ID');
// 跳转授权
location.href = youyun.getAuthUrl('https://your-app.com/callback.php');
// 换取 Token
const result = await youyun.exchangeCode(code, redirectUri);
// 获取用户信息
const user = await youyun.getUserInfo(result.access_token);
PKCE 模式
// PHP
\$pkce = Youyun::generatePKCE();
\$authUrl = \$youyun->getAuthUrlWithPKCE(redirectUri, \$pkce['challenge']);
\$result = \$youyun->exchangeCode(\$code, redirectUri, \$pkce['verifier']);
// JavaScript
const pkce = await Youyun.generatePKCE();
location.href = youyun.getAuthUrlWithPKCE(redirectUri, pkce.challenge);
const result = await youyun.exchangeCode(code, redirectUri, pkce.verifier);
示例文件
sdk/example-php.php — 标准 OAuth 接入示例
sdk/example-pkce.php — PKCE 模式接入示例
常见问题
如何获取应用凭证?
管理后台 → 应用管理 → 创建应用。创建后会显示 Client ID 和 Client Secret,请妥善保存。
如何撤销已授权的应用?
控制台 → 已授权应用 → 取消授权。撤销后可随时重新授权。
忘记密码怎么办?
管理员在「用户管理」→ 更多操作 → 重置密码。
如何发布公告?
管理后台 → 公告管理 → 发布公告。支持通知、警告、紧急三种类型。公告会以弹窗形式展示给用户,用户点击「我知道了」后不再重复显示,直到公告内容更新。
什么是二级管理员?
管理员可在「用户管理」→ 更多操作 → 设为二级管理员。二级管理员拥有独立的管理后台(youyou2.php),可创建应用和发布公告。二级管理员创建的应用会自动生成授权链接,用户通过链接授权后自动归入该二级管理员的用户列表。主管理后台可查看所有二级管理数据。
如何备份数据?
管理后台 → 配置与备份 → 立即备份。系统会自动打包所有 JSON 数据文件。最多保留 10 个备份,超出自动清理。也可导出配置文件用于迁移。
如何自定义网站信息?
管理后台 → 系统信息,可设置网站标题、简介、标签和图标。设置后所有页面的标题、浏览器标签页图标和顶部栏 logo 都会同步更新。
支持哪些授权模式?
开放模式:任何域名可发起授权请求,适合面向公众的服务。白名单模式:仅白名单中的域名可发起授权,适合企业内部系统。
API 调试器
在线测试 API 接口,填入参数直接调用并查看返回结果。