浏览全部文档 · 10/37

功能简介

Session 保存用户登录态,JWT 用于把当前用户身份短期传递给受信服务,MFA 在已有身份基础上增加挑战与验证步骤。三者解决不同问题:JWT 不是长期 API Key,MFA 也不能替代资源 Permission。

当前支持范围

  • 身份认证与账号(SUPPORTED):为应用提供注册、登录、会话、JWT、多因素认证、账号验证与用户管理;具体登录渠道由项目配置决定。
  • 认证、Scope 与资源权限(SUPPORTED):用 Session、JWT、API Key、细粒度 Scope、Role 与资源级 Permission 共同保护项目控制面和数据面。

适用场景

  • 浏览器通过安全 Cookie 维持登录。
  • SSR 或后端服务短期代表当前用户调用 Project API。
  • 为敏感账号增加 TOTP、恢复码或受支持的二次因子。

前置条件

  • 用户已完成首要登录因子。
  • Project 允许目标 MFA 类型。
  • 服务端能安全保存 Session/JWT,且不会写入客户端日志。

Console 操作路径

Console → Project → Auth → Security 配置安全策略;用户 MFA 流程由应用使用 Account SDK 驱动。Console 的 Project Users 页面可查看和管理用户 Session,但属于管理员能力。

SDK 示例

SDK · TypeScript
import { Client } from 'appbase-web-sdk';

const client = new Client()
  .setEndpoint('https://<APPBASE_HOST>/v1')
  .setProject('<PROJECT_ID>');
import {
  Account,
  AuthenticationFactor,
  AuthenticatorType
} from 'appbase-web-sdk';

const account = new Account(client);
const authenticator = await account.createMFAAuthenticator({
  type: AuthenticatorType.Totp
});
const challenge = await account.createMFAChallenge({
  factor: AuthenticationFactor.Totp
});

// 用户输入一次性验证码后再调用 updateMFAChallenge。
void [authenticator, challenge];
const jwt = await account.createJWT({ duration: 900 });

REST 示例

REST · Bash
curl 'https://<APPBASE_HOST>/v1/account/jwts' \
  -X POST \
  -H 'X-Appwrite-Project: <PROJECT_ID>' \
  -H 'Cookie: <USER_SESSION_COOKIE>' \
  -H 'Content-Type: application/json' \
  --data '{"duration":900}'

权限模型

创建 JWT 需要有效用户 Session;JWT 继承用户身份和资源 Permission,不获得 API Key 的管理 Scope。MFA Challenge 绑定当前账号与挑战状态,验证码和恢复码必须按秘密处理。

常见错误

现象处理建议
401 user_unauthorizedSession 已失效或目标请求不接受当前身份类型。
MFA challenge 无效或过期重新创建 Challenge,不复用旧验证码。
403用户已认证,但目标资源 Permission 或 Project 策略拒绝。

当前限制

  • JWT 应保持短期,不作为永久服务凭据。
  • MFA 支持范围受 SDK 版本和 Project 配置影响。
  • 恢复码只应向用户展示和保存一次,不得进入日志。

Appwrite 兼容说明

Session、JWT 与 MFA 的术语保持兼容;具体方法签名来自 AppBase Web SDK。

AppBase 增强说明

AppBase 把用户身份与 Organization 控制面、Project Scope、资源 Permission 分层处理,并要求开发环境错误响应不泄漏运行时参数。

发布状态和验证 Commit

origin/main 已核验。验证 Commit:0363062a1c7ea08741975bb5ba0c3361663c9353

权威来源文件列表

  • backend-candidate:app/controllers/api/account.php
  • backend-candidate:app/controllers/api/projects.php
  • backend-candidate:src/Appwrite/Platform/Modules/*/Http/
  • backend-candidate:src/Appwrite/Platform/Modules/Account/Services/Http.php
  • backend-candidate:tests/e2e/Services/Account/AccountCustomClientTest.php
  • backend-candidate:tests/e2e/Services/Databases/DatabasesBase.php
  • backend-candidate:tests/e2e/Services/Storage/StorageCustomClientTest.php
  • frontend-candidate:console/src/routes/(console)/project-[region]-[project]/auth/

Appwrite taxonomy 仅作信息架构参考:https://appwrite.io/docs/advanced/securityhttps://appwrite.io/docs/products/auth。上游页面不是 AppBase 实现证据。

继续阅读