抖音小游戏登录教程
通过抖音小游戏对应的服务端接口完成登录(含 access_token 与 jscode2session 流程)。
1. 获取 access_token
用于调用抖音相关服务端能力(服务端带 Redis 缓存)。
GET /api/minigame/douyin/access_token
请求示例
bash
curl "http://localhost:2567/api/minigame/douyin/access_token"响应示例
json
{
"success": true,
"message": "操作成功!",
"data": {
"access_token": "ACCESS_TOKEN",
"expires_in": 7200
}
}2. 抖音登录(jscode2session)
前置条件
code与anonymous_code至少传一个(与抖音侧登录方式一致)
请求
GET /api/minigame/douyin/login
Query 参数:
code:抖音登录 code(非匿名)anonymous_code:匿名 code(可选)
请求示例
bash
curl "http://localhost:2567/api/minigame/douyin/login?code=DOUYIN_CODE"bash
curl "http://localhost:2567/api/minigame/douyin/login?anonymous_code=ANONYMOUS_CODE"服务端行为概要
- 向抖音
jscode2session换取openid、anonymous_openid、session_key、可选unionid等。 - 以
openid→anonymous_openid→unionid顺序取第一个非空值作为本地用户键,查找或创建users记录(AuthService.findOrCreateMinigameUser,platform: 'douyin');新建用户同样 不会在响应中返回密码。 - 签发 JWT
token,userId为 数据库用户主键(UUID);令牌写入 Redis 的规则与微信登录一致。
响应示例
json
{
"success": true,
"message": "操作成功!",
"data": {
"error": 0,
"openid": "OPEN_ID",
"session_key": "SESSION_KEY",
"anonymous_openid": "",
"unionid": "",
"errcode": 0,
"errmsg": "",
"message": "",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"username": "mg_douyin_xxxxxxxx",
"email": "douyin_xxxxxxxx@minigame.local",
"nickname": null,
"avatar": null,
"openid": "OPEN_ID",
"guildId": null,
"status": 1,
"createdAt": "2026-05-02T12:00:00.000Z",
"updatedAt": "2026-05-02T12:00:00.000Z",
"version": 1
}
}
}匿名登录时 openid 可能为空,此时 user.openid 会存匿名 id 或 unionid(与 findOrCreateMinigameUser 入参一致)。
字段说明(data)
| 字段 | 说明 |
|---|---|
error | 抖音错误号,0 表示成功。 |
openid / anonymous_openid / unionid | 平台侧用户标识(视登录方式返回)。 |
session_key | 会话密钥,敏感;建议仅服务端使用。 |
errcode / errmsg / message | 错误细节(成功时多为空或 0)。 |
token | 本项目 JWT 访问令牌。 |
user | 本地用户资料,不含 password。 |
3. 后续(接入房间 / HTTP 鉴权)
- 使用
token接入 Colyseus 房间与受保护 HTTP 接口;JWT 内userId为库主键,与 openid 无必然相等关系。 - 需要展示资料时以
user或后续业务接口为准。
4. 安全提示
session_key请勿在前端明文长期存储或日志中输出;生产环境可评估是否从对外 API 中省略该字段(需改服务端实现)。