接口文档 / 鉴权登录 / 教师登录
教师登录公共只读
账号密码登录(公开)。后端把 loginName 拼成虚拟邮箱后调 Supabase GoTrue 验密,再查共享 profiles 校验 role=teacher 且 status=enabled,通过后用本端 jwt_secret 自签 access(120min)/refresh(30d) 令牌对并返回教师档案。失败:口令错 401;非教师或已停用 403。未配 Supabase 且 DEV_LOGIN=1 时放行任意账号供本地联调。
POST/api/teacher/login
鉴权
本接口无需鉴权(公开接口,在中间件白名单内)。
请求参数
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| loginNamebody | string | 必填 * | 登录名(学号/手机号/自定义登录名),全库唯一;后端 strip+lower 后拼虚拟邮箱 | |
| passwordbody | string | 必填 * | 登录密码(明文传输,后端交 Supabase 校验,非前端预哈希) |
请求示例
curl -X POST 'https://teacher-api.weizhiqingtu.com/api/teacher/login' \
-H 'Content-Type: application/json' \
-d '{"loginName":"示例值","password":"示例值"}'响应示例 · 200 application/json
{
"code": 0,
"message": "ok",
"data": {
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refreshToken": "eyJhbGciOiJIUzI1Ni...refresh",
"teacher": {
"id": "9f1c0b2a-...",
"name": "测试老师",
"role": "teacher",
"code": "zujuan_test",
"phone": null,
"avatar": null,
"schoolId": "0a2b4c6d-...",
"schoolName": "金陵实验中学",
"isAdmin": false
}
}
}| 字段 | 类型 | 说明 |
|---|---|---|
| accessToken | string | 访问令牌,有效期 120 分钟;后续接口放 Authorization: Bearer 头 |
| refreshToken | string | 刷新令牌,有效期 30 天;用于 /refresh 续期 |
| teacher.isAdmin | boolean | 是否运维后台管理员(由后端 ADMIN_LOGINS 名单判定) |
| teacher.schoolId | string | 所属学校 ID,教师数据按此行级隔离 |
错误码
| 状态码 | 错误标识 | 说明 |
|---|---|---|
| 400 | bad_request | 请求参数校验失败 |
| 401 | 账号或密码错误 | GoTrue 验密失败或账号不存在 |
| 403 | 非教师账号 / 账号已停用 | profiles.role≠teacher 或 status≠enabled |
| 404 | not_found | 资源不存在 |
| 500 | internal_error | 服务端内部错误 |
| 503 | auth not configured | 生产环境未配置 Supabase |