OAuth 2.0 接入指南

凌云海开发者平台基于标准 OAuth 2.0 授权码模式(Authorization Code Grant),提供安全可靠的身份验证服务。

协议概述

OAuth 2.0 授权码模式流程如下:

1

构建授权链接

将用户重定向到凌云海的授权页面,请求用户授权。

2

用户授权

用户在凌云海登录并确认授权,浏览器携带授权码回调到您的应用。

3

换取 Token

您的后端使用授权码向凌云海换取 Access Token。

4

获取用户信息

使用 Access Token 调用用户信息接口,获取用户身份。

1. 构建授权链接

将用户浏览器重定向到以下地址:

GET https://accounts.mclinyunhai.com/oauth/authorize
  ?client_id={CLIENT_ID}
  &redirect_uri={REDIRECT_URI}
  &response_type=code
  &state={RANDOM_STATE}
参数 必填 说明
client_id 您的应用的 Client ID
redirect_uri 回调地址,必须与应用注册时填写的一致
response_type 固定值 code
state 推荐 随机字符串,用于防止 CSRF 攻击,回调时会原样返回
强烈建议生成并验证 state 参数,防止跨站请求伪造攻击。

2. 处理回调

用户授权后,浏览器会重定向到您的回调地址,携带以下参数:

GET {YOUR_REDIRECT_URI}
  ?code={AUTHORIZATION_CODE}
  &state={RANDOM_STATE}
参数 说明
code 授权码,有效期 10 分钟,一次性使用
state 与授权请求时相同的 state 值,需验证一致性
如果用户拒绝授权,回调参数中会包含 error=access_denied,请妥善处理。

3. 换取 Access Token

使用授权码向凌云海服务器换取 Access Token:

POST https://api.mclinyunhai.com/oauth/token
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code
&code={AUTHORIZATION_CODE}
&client_id={CLIENT_ID}
&client_secret={CLIENT_SECRET}

成功响应:

{
  "access_token": "eyJhbGciOiJSUzI1NiIs...",
  "token_type": "Bearer",
  "expires_in": 3600
}
参数 说明
access_token 访问令牌,有效期 1 小时
token_type 固定值 Bearer
expires_in 过期时间,单位秒(3600)

4. 获取用户信息

使用 Access Token 获取已授权用户的信息:

GET https://api.mclinyunhai.com/oauth/userinfo
Authorization: Bearer {ACCESS_TOKEN}

成功响应:

{
  "sub": "10001",
  "nickname": "张三",
  "email": "zhangsan@example.com",
  "avatar": "https://accounts.mclinyunhai.com/uploads/avatars/10001.jpg"
}
字段 说明
sub 用户唯一标识(用户 ID)
nickname 用户昵称
email 用户邮箱
avatar 用户头像 URL

完整示例(PHP)

<?php
// 1. 构建授权链接
$clientId = 'your_client_id';
$redirectUri = 'https://your-app.com/callback';
$state = bin2hex(random_bytes(16));

$_SESSION['oauth_state'] = $state;

$authUrl = 'https://accounts.mclinyunhai.com/oauth/authorize?' . http_build_query([
    'client_id'    => $clientId,
    'redirect_uri' => $redirectUri,
    'response_type'=> 'code',
    'state'        => $state,
]);

header('Location: ' . $authUrl);

// 2. 回调处理
$code = $_GET['code'];
// 验证 state
if (!hash_equals($_SESSION['oauth_state'], $_GET['state'])) {
    die('CSRF 攻击检测');
}

// 3. 换取 Token
$ch = curl_init('https://api.mclinyunhai.com/oauth/token');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => http_build_query([
        'grant_type'    => 'authorization_code',
        'code'          => $code,
        'client_id'     => $clientId,
        'client_secret' => $clientSecret,
    ]),
    CURLOPT_RETURNTRANSFER => true,
]);
$tokenData = json_decode(curl_exec($ch), true);

// 4. 获取用户信息
$ch = curl_init('https://api.mclinyunhai.com/oauth/userinfo');
curl_setopt_array($ch, [
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $tokenData['access_token']],
    CURLOPT_RETURNTRANSFER => true,
]);
$userInfo = json_decode(curl_exec($ch), true);

echo '欢迎,' . $userInfo['nickname'];
?>