Semestra

认证

网页应用用会话 cookie,原生应用用访问令牌,脚本和 MCP 用 API 令牌。

OpenAPI schema 声明了三种认证方式,每个接口都列出了它接受的方式。

方式发送形式用于哪些接口接受
sessionCookiesemestra_session cookie网页应用所有需要登录的接口
accessTokenAuthorization: Bearer <JWT>原生应用所有需要登录的接口
personalAccessTokenAuthorization: Bearer spat_…脚本和 MCP 客户端/mcp 以及对 MCP 开放的能力

Bearer 请求头优先于 cookie;Bearer 值无效的请求不会退回使用 cookie。

API 令牌

在全局设置 → 账户 → API 令牌 里创建(已登录会话调用 POST /account/tokens)。密钥只返回一次,Semestra 只保存它的哈希。

  • 权限:read,或 read + write。只读令牌只能调用读取类操作。
  • 范围:API 令牌可用于 /mcp,以及对 MCP 开放的能力的 HTTP 接口,即接口参考中标有 personalAccessToken 的接口。 账户、AI 服务商、令牌和数据导出等接口会以 auth.token_scope 拒绝。
  • 有效期:永不过期,或 30、90、365 天后过期。在同一页面可以吊销令牌。
curl https://semestra.example.com/programs \
  -H "Authorization: Bearer spat_…"

登录接口(/auth/email/verify、/auth/password/login、/auth/google)会设置两个 cookie:semestra_session(HTTP-only)和 semestra_csrf。 除 GET、HEAD、OPTIONS 外的请求都必须在 X-Semestra-CSRF 请求头里带上 CSRF cookie 的值。

原生应用的访问令牌

在登录请求后加 ?client=native,令牌会放在响应体里而不是 cookie 中:

{ "tokens": { "access_token": "…", "refresh_token": "…", "token_type": "Bearer", "expires_in": 900 } }

访问令牌默认有效 15 分钟;用 POST /auth/token/refresh 换取新的令牌。能力之外的接口(例如文件上传和 /events/stream)不接受 API 令牌,所以原生应用在这些地方使用访问令牌。