OAuth2 API参考文档
这是一个关于如何对接OAuth2协议的详细参考文档。
OAuth2 授权端点
授权端点
authorization_endpoint
: https://id.rutno.com/rn-oauth/authorize
这是用户进行身份验证并授权客户端访问其资源的入口。用户会在此页面登录,并选择是否允许客户端访问其数据。
令牌端点
token_endpoint
: https://id.rutno.com/rn-oauth/token
此端点用于将授权码(Authorization Code)交换为访问令牌(Access Token)。访问令牌是后续请求受保护资源的关键。
用户信息端点
userinfo_endpoint
: https://id.rutno.com/rn-oauth/userinfo
该端点允许客户端通过访问令牌获取用户的基本信息,例如用户名、邮箱、头像等。
OAuth2 授权流程详解
1. 重定向用户到授权页面
在OAuth2中,第一步是将用户重定向到授权服务器的身份验证页面。这个页面由用户提供登录凭据,并决定是否授予客户端访问权限。
参数说明
response_type
: 必须设置为code
,表示使用授权码模式。client_id
: 应用程序注册后获得的唯一标识符。redirect_uri
: 用户授权完成后,授权服务器将用户重定向回此地址。scope
: 请求的权限范围,多个权限用空格分隔。例如:id account_id username email phone gender birthday avatar bio nickname region
。state
: 随机生成的字符串,用于防止CSRF攻击。
示例代码
<?php $params = [ 'response_type' => 'code', 'client_id' => '67ff612d0fd27a8108a769f5415ecc27', // 替换为您的Client ID 'redirect_uri' => 'https://picbox.rutno.com/auth', // 替换为您的回调地址 'scope' => 'id account_id username email phone gender birthday avatar bio nickname region', 'state' => bin2hex(random_bytes(16)) // 生成随机字符串防止CSRF攻击 ]; $auth_url = 'https://id.rutno.com/rn-oauth/authorize?' . http_build_query($params); header('Location: ' . $auth_url); ?>
注意事项
state
参数非常重要,必须在回调时验证其值是否与原始请求一致,以防止跨站请求伪造(CSRF)攻击。redirect_uri
必须与您在OAuth2服务提供商处注册的回调地址完全匹配。
2. 处理回调,获取访问令牌
当用户完成授权后,授权服务器会将用户重定向到指定的redirect_uri
,并在URL中附带一个授权码(code
)和状态参数(state
)。接下来需要使用授权码向令牌端点请求访问令牌。
回调处理
<?php // 验证state参数 if ($_GET['state'] !== $_SESSION['oauth_state']) { die('State验证失败'); } // 获取授权码 $code = $_GET['code']; ?>
请求访问令牌
使用授权码和客户端凭据向令牌端点发送POST请求,以换取访问令牌。
请求参数
grant_type
: 设置为authorization_code
,表示使用授权码模式。code
: 上一步从回调中获取的授权码。redirect_uri
: 必须与上一步使用的redirect_uri
一致。client_id
: 客户端ID。client_secret
: 客户端密钥,用于验证客户端身份。
示例代码
<?php $token_params = [ 'grant_type' => 'authorization_code', 'code' => $code, 'redirect_uri' => 'https://picbox.rutno.com/auth', // 替换为您的回调地址 'client_id' => '67ff612d0fd27a8108a769f5415ecc27', // 替换为您的Client ID 'client_secret' => 'YOUR_CLIENT_SECRET' // 替换为您的Client Secret ]; $ch = curl_init('https://id.rutno.com/rn-oauth/token'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($token_params)); $response = curl_exec($ch); curl_close($ch); $token_data = json_decode($response, true); $access_token = $token_data['access_token']; ?>
注意事项
- 访问令牌通常具有一定的有效期,过期后需要刷新。
- 响应中可能还包含其他字段,如
refresh_token
,可用于刷新访问令牌。
3. 获取用户信息
获得访问令牌后,可以使用它访问用户信息端点,获取用户的基本信息。
请求方式
向用户信息端点发送GET请求,并在请求头中添加Authorization
字段,格式为Bearer <access_token>
。
示例代码
<?php $ch = curl_init('https://id.rutno.com/rn-oauth/userinfo'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Authorization: Bearer ' . $access_token ]); $response = curl_exec($ch); curl_close($ch); $user_info = json_decode($response, true); // 输出用户信息 print_r($user_info); ?>
返回字段
用户信息端点返回的数据可能包括以下字段:
id
: 用户唯一标识。account_id
: 账户ID。username
: 用户名。email
: 用户邮箱。phone
: 用户手机号。gender
: 性别。birthday
: 生日。avatar
: 用户头像URL。bio
: 用户个人简介。nickname
: 昵称。region
: 所在地区。
使用限制与注意事项
访问频率限制
每个IP每分钟最多允许60次请求。请合理控制请求频率,避免超出限制。
安全性
- 确保
client_secret
的安全性,不要将其硬编码在前端代码中。 - 在回调中严格验证
state
参数,防止CSRF攻击。
Scope权限
请求的权限范围(scope
)决定了您可以访问的用户数据。请确保只请求必要的权限,遵循最小权限原则。
Token管理
- 访问令牌有有效期,请妥善存储并及时刷新。
- 刷新令牌(
refresh_token
)也需要安全存储,避免泄露。