1 个稳定版本

15.1.0 2021年5月1日
14.1.2 2021年4月16日
13.0.2 2021年4月11日
12.0.2 2021年4月8日
0.8.1 2020年1月8日

#593 in HTTP服务器

Download history 108/week @ 2024-03-27 30/week @ 2024-04-03 51/week @ 2024-07-03

每月 51 次下载

MIT 许可证

55KB
924

Broker - 实时BaaS(后端即服务)

目的

本服务的目的是成为您的实时BaaS(后端即服务)。

Broker是一个SSE消息经纪人,您无需编写任何后端代码即可拥有完整的实时API。

Broker源于这样一个需求:与其构建一个复杂的REST API,使用WebSocket和SQL数据库来提供反应式Web表单(如React),不如有更简单的方法。

Broker遵循插入/发布/订阅范式,而不是REST CRUD范式。

Broker还提供完整的身份服务,使用JWT、HTTP Basic、双因素和TOTP。

Broker与FirebaseParse ServerAuth0AWS CognitoAWS IAMAWS SimpleDBAWS SNS竞争。

功能

  • 性能出色,几乎无CPU和内存使用
  • 少于1000行代码
  • 通过SSE提供安全的实时事件流 - 需要broker-client的使用
  • 支持CORS
  • JSON API
  • 使用管理员令牌权限添加用户
  • 多租户
  • 支持SSL - 完整端到端加密
  • 提供JWT或HTTP Basic进行用户身份验证
  • 为外部服务生成JWT以进行身份验证(用户名)和授权(范围)
  • 使用biscuit进行用户授权范围
  • portalfiles等外部服务提供验证端点
  • 使用Argon2编码进行安全密码存储
  • 使用全球NTP服务器,不依赖于您本地服务器的本地时间进行JWT过期时间和双因素时间
  • 在SSE客户端连接时同步最新事件
  • 自动通过Let's Encrypt续订SSL证书或使用自己的SSL证书
  • 用户管理API端点(创建、撤销、恢复、列表、获取、更新)
  • 使用mailchecker进行用户电子邮件地址验证(正则表达式和黑名单检查垃圾邮件)
  • 使用zxcvbn密码强度检查器
  • 使用二维码生成Google Authenticator、Authy等的双重身份验证
  • 使用可配置时间持续性的TOTP安全地重置用户密码

工作原理

在代理中创建用户,登录,然后插入一个包含其数据的事件。代理随后通过SSE发布事件。

当客户端首次订阅SSE连接时,所有最新事件和数据都会发送到客户端。与在订阅时通过SSE发送最新事件相结合,消除了在事件生命周期中进行任何GET API请求的必要性。

该系统的副作用是最新事件是模式。这是纯NoSQL,因为后端对事件数据是无关的。

推荐与代理一起使用的服务/库

使用

步骤 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
  • emailscopestwo_factordata是可选字段
  • scopesbiscuit权限作用域/事实,因此冒号之前的部分是资源,冒号之后的部分是操作。不要在作用域中添加任何额外的冒号。

将返回200500400

对于JWT认证:步骤 2 - 使用用户登录

POST /login 
  • 公共端点
{
    "username": "bob", 
    "password": "password1",
    "totp": "123456",
}
  • 如果用户启用了双重身份验证,则必须提供totp - 如果没有,则可以省略该字段

将返回:200500400401

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"
    }
}

将返回:200500400401

可选 - 验证用户

GET /verify
  • 认证端点(Authorization: Bearer {jwt})或(Authorization: Basic {username:password})
  • 验证用户是否已在代理上认证 - 用于外部服务,如portal

将返回:200500401

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"
}

将返回:200500400401

  • 注意:已撤销的用户无法登录

可选 - 恢复用户

POST /unrevoke_user
  • 公共端点
{
    "admin_token": "letmein",
    "username": "bob"
}

将返回:200500400401

可选 - 列出用户

POST /list_users
  • 公共端点
{
    "admin_token": "letmein"
}

将返回:200500400401

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"
        }
    }
]
  • 注意:emailscopestwo_factordata 可以为 null

可选 - 获取用户

POST /get_user
  • 公共端点
{
    "admin_token": "letmein",
    "username": "bob"
}

将返回:200500400401

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"
    }
}
  • 注意:emailscopestwo_factordata 可以为 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_namepasswordemailscopesdata 是可选字段

将返回:200500400401

可选 - 健康检查

GET or HEAD /
  • 公共端点

将返回:200

可选 - 生成双因素二维码

POST /create_qr
  • 公共端点
{
    "issuer": "Broker",
    "admin_token": "letmein",
    "username": "bob"
}
  • 注意:在发行者字段中填写您应用程序的名称
  • 注意:二维码的ID将是用户的用户名和您的发行者字段

将返回:200500400401

200 - 将以base64格式以PNG格式返回二维码

{
    "qr": "dGhpc2lzYXN0cmluZw=="
}

可选 - 创建totp

POST /create_totp
  • 公共端点
{
    "admin_token": "letmein",
    "username": "bob"
}

将返回:200500400401

200 - 将返回totp

{
    "totp": "622346"
}
  • 注意:这些TOTPs只能与密码重置端点一起使用

可选 - 用户密码重置

POST /password_reset
  • 公共端点
{
    "totp": "622346",
    "username": "bob",
    "password": "password1"
}

将返回:200500400401

安装

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_certfalse时,key_path标志用于设置您自己的SSL密钥路径 - 默认 certs/private_key.pem
  • auto_certfalse时,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