#web-server #server #access-token #security #server-response #one-time-token

app token_server

为某些元数据集提供一次性访问令牌的服务器

14个版本

0.1.15 2022年12月10日
0.1.14 2022年12月10日
0.1.2 2022年11月29日

#510 in 身份验证

每月50次下载

自定义许可协议

67KB
1.5K SLoC

Rust 1K SLoC // 0.0% comments JavaScript 189 SLoC // 0.0% comments

令牌服务器

为某些元数据集提供一次性访问令牌的服务器

该服务器的目的是提供访问令牌,例如用于Web或REST服务器。

令牌服务器应在受保护的环境中运行,只能从本地网络访问。Web服务器收集一些元数据,这些数据将用于所有随后的Web服务器访问。Web服务器从令牌服务器请求一个新的令牌,并将其包含在向用户的响应中。在用户下一次请求Web服务器时,Web服务器从请求中检索令牌,并向令牌服务器发送更新请求。如果成功,Web服务器可以将元数据以及新的令牌包含在响应中。此过程会为每个随后的用户请求重复进行。如果令牌服务器响应为无效令牌,Web服务器可能会决定将用户重定向到登录页面。

如果有更多状态需要跟踪,例如年份和月份或需要工作的业务单位,Web服务器可以将这些值作为元数据添加到更新请求中,以供令牌服务器使用。令牌服务器将添加或更新到现有令牌的元数据中的键值对。

免责声明:不适合高容量元数据集。我的估计是,它可以很好地扩展到最多10万个元数据项,以及每秒最多1000次交易。要存储更多数据或允许更多流量,似乎使用数据库后端更为合适。

用法

用法

RUST_LOG='tower_http=trace,token_server=debug' cargo run [OPTIONS]

可选参数

  -h, --help       print this help message
  -d, --dump       allow for HEAD /dump endpoint to log all metadata
  -p, --port PORT  Which port to listen on (default: 3666)
  -P, --purge-interval PURGE-INTERVAL
                   What frequency to remove expired tokens, between 1s and 90min (default: 1min)
  -t, --token-lifetime TOKEN-LIFETIME
                   How long does a token remain valid, between 30min and 96h (default: 2h)

REST API

  • POST /token 在请求体中为提供的元数据创建新的令牌

    Returns: (text/plain) the new token
    
  • PUT /token 交换令牌以获取新的一个。可选地添加元数据以更新现有集合中的这些字段

    Returns: (application/json) either the new token and it's associated metadata
                                or an error message (see below) 
    
  • DELETE /token 删除令牌及其元数据

    Returns: 202 Accepted
    
  • HEAD /dump 请求服务器将所有元数据和相关的过期时间戳输出到服务器日志

    Returns: 202 Accepted
    

元数据

POST和PUT请求都接受一个JSON主体,该主体必须包含一个"meta"键,该键必须是一个单个JSON对象。

    {
        "meta": {
            "name": "My user",
            "year": 2022,
            "period": 11
        } 
    }

PUT结果

  • 成功时
    {
        "Ok": {
            "token": "XXXX",
            "meta": {
                "name": "My user",
                "year": 2022,
                "period": 11
            }
        } 
    }
  • 出错时
  {
      "Err": "InvalidToken"
  }

依赖关系

~19–29MB
~518K SLoC