1 个稳定版本
15.1.0 | 2021年5月1日 |
---|---|
14.1.2 |
|
13.0.2 |
|
12.0.2 |
|
0.8.1 |
|
#593 in HTTP服务器
每月 51 次下载
55KB
924 行
Broker - 实时BaaS(后端即服务)
目的
本服务的目的是成为您的实时BaaS(后端即服务)。
Broker是一个SSE消息经纪人,您无需编写任何后端代码即可拥有完整的实时API。
Broker源于这样一个需求:与其构建一个复杂的REST API,使用WebSocket和SQL数据库来提供反应式Web表单(如React),不如有更简单的方法。
Broker遵循插入/发布/订阅范式,而不是REST CRUD范式。
Broker还提供完整的身份服务,使用JWT、HTTP Basic、双因素和TOTP。
Broker与Firebase、Parse Server、Auth0、AWS Cognito、AWS IAM、AWS SimpleDB和AWS SNS竞争。
功能
- 性能出色,几乎无CPU和内存使用
- 少于1000行代码
- 通过SSE提供安全的实时事件流 - 需要broker-client的使用
- 支持CORS
- JSON API
- 使用管理员令牌权限添加用户
- 多租户
- 支持SSL - 完整端到端加密
- 提供JWT或HTTP Basic进行用户身份验证
- 为外部服务生成JWT以进行身份验证(用户名)和授权(范围)
- 使用biscuit进行用户授权范围
- 为portal和files等外部服务提供验证端点
- 使用Argon2编码进行安全密码存储
- 使用全球NTP服务器,不依赖于您本地服务器的本地时间进行JWT过期时间和双因素时间
- 在SSE客户端连接时同步最新事件
- 自动通过Let's Encrypt续订SSL证书或使用自己的SSL证书
- 用户管理API端点(创建、撤销、恢复、列表、获取、更新)
- 使用mailchecker进行用户电子邮件地址验证(正则表达式和黑名单检查垃圾邮件)
- 使用zxcvbn密码强度检查器
- 使用二维码生成Google Authenticator、Authy等的双重身份验证
- 使用可配置时间持续性的TOTP安全地重置用户密码
工作原理
在代理中创建用户,登录,然后插入一个包含其数据的事件。代理随后通过SSE发布事件。
当客户端首次订阅SSE连接时,所有最新事件和数据都会发送到客户端。与在订阅时通过SSE发送最新事件相结合,消除了在事件生命周期中进行任何GET API请求的必要性。
该系统的副作用是最新事件是模式。这是纯NoSQL,因为后端对事件数据是无关的。
推荐与代理一起使用的服务/库
- broker-client - 代理的官方前端客户端
- broker-hook - 代理的官方react hook
- React Hook Form - React最佳表单库
- React Debounce Input - React实时提交输入(编辑位置表单)
使用
步骤 1 - 创建用户
POST /create_user
- 公共端点
{
"username": "bob",
"password": "password1",
"admin_token": "letmein",
"tenant_name": "tenant_1",
"email": "[email protected]",
"two_factor": true,
"scopes": ["news:get", "news:post"],
"data": {
"name": "Robert Wieland",
"image": "https://img.com/bucket/123/123.jpg"
}
}
admin_token
是必需的,可以在命令行参数中设置 - 它用于不允许每个人添加用户 - 默认是letmein
email
、scopes
、two_factor
和data
是可选字段scopes
是biscuit权限作用域/事实,因此冒号之前的部分是资源,冒号之后的部分是操作。不要在作用域中添加任何额外的冒号。
将返回200
或500
或400
对于JWT认证:步骤 2 - 使用用户登录
POST /login
- 公共端点
{
"username": "bob",
"password": "password1",
"totp": "123456",
}
- 如果用户启用了双重身份验证,则必须提供
totp
- 如果没有,则可以省略该字段
将返回:200
或500
或400
或401
200 - 将返回JWT
{
"jwt": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTc2NzQ5MTUsImlhdCI6MTYxNzU4ODUxNSwiaXNzIjoiRGlzcGF0Y2hlciIsInN1YiI6ImZvbyJ9.OwiaZJcFUC_B0CA0ffRZVTWKRf5_vQ7vt5USNJEeKRE"
}
- 注意:如果您需要调试JWT,请访问jwt.io
步骤 3 - 连接到SSE
GET /sse
- 认证端点(Authorization: Bearer {jwt})或(Authorization: Basic {username:password})
- 使用broker-client将您的sse-client连接到该端点
note
:broker-client使用fetch,因为eventsource不支持headers
步骤 4 - 插入事件
POST /insert
- 认证端点(Authorization: Bearer {jwt})或(Authorization: Basic {username:password})
{
"event": "test",
"data": {
"name": "robert",
"image": "https://img.com/bucket/123/123.jpg"
}
}
将返回:200
或500
或400
或401
可选 - 验证用户
GET /verify
- 认证端点(Authorization: Bearer {jwt})或(Authorization: Basic {username:password})
- 验证用户是否已在代理上认证 - 用于外部服务,如portal
将返回:200
或 500
或 401
200 - 将返回微服务的公钥、biscuit令牌、用户名和JWT过期时间(使用from_bytes来激活密钥和令牌)
{
"key": [136,133,229,196,134,20,240,80,159,158,154,20,57,35,198,7,156,160,193,224,174,209,51,150,27,86,75,122,172,24,114,66],
"token": [122,133,229,196,134,20,240,80,159,158,154,20,57,35,198,7,156,160,193,224,174,209,51,150,27,86,75,122,172,24,114,121],
"expiry": 1618352841,
"username": "bob",
"scopes": ["news:get", "news:post"]
}
可选 - 撤销用户
POST /revoke_user
- 公共端点
{
"admin_token": "letmein",
"username": "bob"
}
将返回:200
或500
或400
或401
- 注意:已撤销的用户无法登录
可选 - 恢复用户
POST /unrevoke_user
- 公共端点
{
"admin_token": "letmein",
"username": "bob"
}
将返回:200
或500
或400
或401
可选 - 列出用户
POST /list_users
- 公共端点
{
"admin_token": "letmein"
}
将返回:200
或500
或400
或401
200 - 将返回对象数组
[
{
"id": "69123c04-fa42-4193-a6c5-ab2fc27658b1",
"password": "***",
"totp": "***",
"revoked": false,
"tenant_name": "tenant_1",
"username": "bob",
"email": "[email protected]",
"scopes": ["news:get", "news:post"],
"data": {
"name": "Robert Wieland",
"image": "https://img.com/bucket/123/123.jpg"
}
}
]
- 注意:
email
、scopes
、two_factor
和data
可以为null
可选 - 获取用户
POST /get_user
- 公共端点
{
"admin_token": "letmein",
"username": "bob"
}
将返回:200
或500
或400
或401
200 - 将返回对象数组
{
"id": "69123c04-fa42-4193-a6c5-ab2fc27658b1",
"password": "***",
"totp": "***",
"revoked": false,
"tenant_name": "tenant_1",
"username": "bob",
"email": "[email protected]",
"scopes": ["news:get", "news:post"],
"data": {
"name": "Robert Wieland",
"image": "https://img.com/bucket/123/123.jpg"
}
}
- 注意:
email
、scopes
、two_factor
和data
可以为null
可选 - 更新用户
POST /update_user
- 公共端点
{
"admin_token": "letmein",
"username": "bob",
"tenant_name": "tenant_2",
"password": "new_password",
"email": "[email protected]",
"scopes": ["news:get", "news:post"],
"data": {
"name": "Robert Falcon",
"image": "https://img.com/bucket/123/1234.jpg"
}
}
- 注意:
tenant_name
、password
、email
、scopes
、data
是可选字段
将返回:200
或500
或400
或401
可选 - 健康检查
GET or HEAD /
- 公共端点
将返回:200
可选 - 生成双因素二维码
POST /create_qr
- 公共端点
{
"issuer": "Broker",
"admin_token": "letmein",
"username": "bob"
}
- 注意:在发行者字段中填写您应用程序的名称
- 注意:二维码的ID将是用户的用户名和您的发行者字段
将返回:200
或500
或400
或401
200 - 将以base64格式以PNG格式返回二维码
{
"qr": "dGhpc2lzYXN0cmluZw=="
}
可选 - 创建totp
POST /create_totp
- 公共端点
{
"admin_token": "letmein",
"username": "bob"
}
将返回:200
或500
或400
或401
200 - 将返回totp
{
"totp": "622346"
}
- 注意:这些TOTPs只能与密码重置端点一起使用
可选 - 用户密码重置
POST /password_reset
- 公共端点
{
"totp": "622346",
"username": "bob",
"password": "password1"
}
将返回:200
或500
或400
或401
安装
cargo安装代理
origin
可以作为标志传入 - 默认*
port
可以作为标志传入 - 默认8080
- 只能设置不安全的连接- 为jwts的
jwt_expiry
可以作为一个标志以秒为单位传入 - 默认86400
- 为jwts的
jwt_secret
应该作为一个标志传入 - 默认secret
- https的
secure
标志可以是true或false - 默认false
- 自动续期的LetEncrypt SSL证书的
auto_cert
标志可以是true或false - 需要可解析的域 - 默认true
- 当
auto_cert
为false
时,key_path
标志用于设置您自己的SSL密钥路径 - 默认certs/private_key.pem
- 当
auto_cert
为false
时,cert_path
标志用于设置您自己的SSL证书路径 - 默认certs/chain.pem
certs
标志是LetEncrypt证书的存储路径 - 默认certs
db
标志是嵌入式数据库保存的路径 - 默认db
domain
标志是要注册到LetEncrypt的域名(例如api.broker.com)的域名 - 必须是完全可解析的admin_token
标志是管理员添加用户的密码 - 默认letmein
password_checker
标志启用了zxcvbn密码检查 - 默认false
- the
totp_duration
标志是用户生成密码重置时 TOTP 的持续时间 - 默认 300 秒(5 分钟) - 生产示例:
./broker --secure="true" --admin_token"23ce4234@123$" --jwt_secret="xTJEX234$##$" --domain="api.broker.com" --password_checker="true"
服务
在代码中有一个 Ubuntu 的 systemctl
服务示例,名为 broker.service
技术栈
灵感
依赖项
~81MB
~1.5M SLoC