JWT 认证
本指南介绍如何配置 Palpo 使用 JSON Web Tokens (JWT) 进行用户认证。
概述
JWT 认证允许外部系统在不要求用户输入 Matrix 凭据的情况下认证用户。这在以下场景很有用:
- 将 Matrix 集成到具有自己认证系统的现有应用
- 单点登录(SSO)场景
- 需要以用户身份操作的自动化系统
- 从使用 JWT 认证的 Synapse 或其他 homeserver 迁移
前提条件
- 能够生成有效 JWT 的系统
- 共享密钥(用于 HMAC)或公钥(用于 ECDSA)
- 理解 JWT 声明和结构
基本配置
在您的 palpo.toml 配置文件中添加以下部分:
配置选项
密钥格式
HMAC(默认)
使用纯文本共享密钥:
生成安全密钥:
B64HMAC
使用 base64 编码的密钥(适用于二进制密钥):
生成 base64 密钥:
ECDSA
使用 PEM 编码的公钥进行非对称验证:
JWT 令牌结构
JWT 令牌必须包含以下声明:
sub(主题)声明用作 Matrix 用户 ID(本地部分)。
可选声明
令牌验证
配置验证要求:
登录流程
使用 JWT 认证:
- 您的应用程序生成包含用户身份的 JWT
- 客户端向 Palpo 发出登录请求:
- Palpo 验证令牌并创建/认证用户
- 客户端收到用于 Matrix API 调用的访问令牌
示例:在不同语言中生成 JWT
Python
Node.js
Rust
安全考虑
- 保护密钥安全:永远不要在客户端代码或日志中暴露 HMAC 密钥
- 使用强密钥:HMAC 算法至少 256 位(32 字节)
- 设置过期时间:始终包含
exp声明并设置require_exp = true - 验证发行者:设置
issuer以防止来自不受信任来源的令牌 - 使用 HTTPS:始终通过加密连接传输令牌
- 考虑 ECDSA:对于面向公众的系统,非对称密钥(ECDSA)更安全,因为验证密钥可以共享而不会危及令牌生成
Synapse 迁移
如果从使用 JWT 认证的 Synapse 迁移:
故障排除
"Invalid token" 错误
- 验证令牌生成器和 Palpo 之间的密钥是否匹配
- 检查算法是否匹配(
HS256、ES256等) - 确保令牌未过期
"User not found" 错误
- 如果
register_user = false,用户必须已存在 - 检查
sub声明是否包含有效的用户名
"Invalid audience/issuer" 错误
- 确保令牌声明与配置的
audience和issuer数组匹配 - 检查大小写敏感性和精确字符串匹配
签名验证失败
- 对于 HMAC:确保密钥完全相同(注意额外空格)
- 对于 ECDSA:确保公钥格式正确(PEM 格式)
- 验证令牌头中的算法与配置匹配