API 认证
访问一些带有权限限制的 API 时,需要经过 API 认证。
用户角色等级
用户权限通过登录信息中的 roleid
表示不同的角色等级。
roleid | 角色 | 说明 |
---|---|---|
-1 | 被封禁用户 | 禁止登录,无法使用任何 API |
0 | 未激活用户 | 登录后只能使用发送激活邮件等功能,无法访问个人中心等 |
1 | 未报名用户 | 系统的普通用户。可以使用个人中心、创建组队、接受邀请等系统功能。不能进入谜题前端。 |
2 | 队员 | 组队的成员。可以使用个人中心等功能,无法使用组队管理。比赛开始后可以进入谜题前端。 |
3 | 队长 | 组队的管理者。可以使用个人中心等功能,可以修改队伍信息、人员管理、发送邀请等功能。比赛开始后可以进入谜题前端。 |
4 | 出题组成员 | 比赛的组织者。除个人中心、谜题前端等权限外,可以进入管理后台进行编辑等操作,不能进行配置修改、清理缓存、激活插件等事务性操作。 |
5 | 管理员 | 系统的管理员。可以进行所有操作。 |
内测用户和有效时间
除了用户角色权限之外,一些 API 还必须在开赛时间范围内调用。
但是,可以将一些用户设置为“内测用户”,他们可以在任意时间调用这些 API。
认证信息
登录时将返回以下信息用于认证:
参数名 | 类型 | 说明 |
---|---|---|
roleid | int | 角色等级ID |
token | string | 用户登录Token |
sk | string | 用户认证密钥 |
etc | string | 用户额外权限信息(当值为 52412 时,表示内测用户) |
原则上来说前端在调用 API 之前,需要前置检查权限是否满足调用许可。
认证方式
在每次进行 API 调用时,都必须在 Header
中增加以下两条内容:
User-Token: <用户登录Token>
X-Auth-Token: Ccxc-Auth <时间戳> <签名>
其中,时间戳是精度为毫秒的 int64
整数时间戳。如 2025-06-01 08:00:00 UTC+8
对应的时间戳为 1748736000000
签名按照以下的逻辑计算:
unsigned = "token=${token}&ts={ts}&bodyString={stringifiedJson}"
sign = base64(HmacSHA1(unsigned, sk))
其中 ts
是时间戳。stringifiedJson
是 Body 内容的字符串。
示例 JavaScript 实现:
javascript
import axios from axios
import CryptoJS from 'crypto-js'
function generateSign(token, sk, ts, data) {
const stringifiedJson = JSON.stringify(data)
const unsigned = `token=${token}&ts=${ts}&bodyString=${stringifiedJson}`
const sign = CryptoJS.HmacSHA1(unsigned, sk).toString(CryptoJS.enc.Base64)
}
// 启动请求
const request = axios.create({
baseURL: "https://api.example.com/api/v1"
method: "post",
headers: {
'Content-Type': 'application/json'
}
})
request.interceptors.request.use(
(config) => {
const { token, sk } = useUserStore()
const ts = Date.now()
const sign = generateSign(token, sk, ts, config.data || {})
config.headers['User-Token'] = token
config.headers['X-Auth-Token'] = `Ccxc-Auth ${ts} ${sign}`
return config
},
(error) => {
return Promise.reject(error)
}
)