Skip to content

API 认证

访问一些带有权限限制的 API 时,需要经过 API 认证。

用户角色等级

用户权限通过登录信息中的 roleid 表示不同的角色等级。

roleid角色说明
-1被封禁用户禁止登录,无法使用任何 API
0未激活用户登录后只能使用发送激活邮件等功能,无法访问个人中心等
1未报名用户系统的普通用户。可以使用个人中心、创建组队、接受邀请等系统功能。不能进入谜题前端。
2队员组队的成员。可以使用个人中心等功能,无法使用组队管理。比赛开始后可以进入谜题前端。
3队长组队的管理者。可以使用个人中心等功能,可以修改队伍信息、人员管理、发送邀请等功能。比赛开始后可以进入谜题前端。
4出题组成员比赛的组织者。除个人中心、谜题前端等权限外,可以进入管理后台进行编辑等操作,不能进行配置修改、清理缓存、激活插件等事务性操作。
5管理员系统的管理员。可以进行所有操作。

内测用户和有效时间

除了用户角色权限之外,一些 API 还必须在开赛时间范围内调用。

但是,可以将一些用户设置为“内测用户”,他们可以在任意时间调用这些 API。

认证信息

登录时将返回以下信息用于认证:

参数名类型说明
roleidint角色等级ID
tokenstring用户登录Token
skstring用户认证密钥
etcstring用户额外权限信息(当值为 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)
    }
)

Released under the MIT License. Powered by VitePress.