4 个版本 (2 个重大更改)
0.8.0 | 2022年5月9日 |
---|---|
0.7.0 | 2021年9月10日 |
0.6.3 | 2021年9月1日 |
0.6.2 | 2021年9月1日 |
#1 在 #niftygate
被 2 个 crate 使用
13MB
250K SLoC
niftygate - 通过 NFT 所有权实现即插即用访问控制
简介
使用任何智能合约,部署到任何区块链,无需修改您的代码即可访问网络上的任何内容。
概述
如果您将代币视为进入俱乐部的门票,NiftyGate 就像是门口的保安。
-
兼容典型的代币标准,包括可互换和不可互换的代币(ERC20、ERC721、ERC777 和 ERC1155)。
-
与任何通过 WebSocket 与 Web3 通信的区块链兼容。
-
位于任何使用 HTTP 进行通信的东西前面。
-
具有嵌入模式,可用于客户端应用程序。
-
与任何支持 HTTP 标头的身份验证系统集成。
-
提供选择、部署、调试和审计兼容智能合约的工具。
-
作为单个自包含的二进制文件提供。
-
跨平台(已在 Linux 和 macOS 上进行测试,应该在其他地方也能工作)。
-
开源(MIT 许可),并用 Rust 编写。
这是什么?
niftygate
是一个 HTTP 服务的代理,它验证签名,为这些服务提供身份验证层。它还具有客户端功能,自动将签名注入到请求中。
我能用它做什么?
截至 0.2
版本,支持智能合约。这些允许使用代币作为可转让的许可证,用于访问受限服务。
一些示例
- 一个 OCI 仓库,允许有许可证的用户下载资产。
- 一个问题跟踪器,允许项目支持者获得优先支持。
- 一个项目路线图,允许客户按比例投票权来决定功能开发。
- 一个部署管道,需要 N-of-M 个授权用户才能发布到生产。
- 一个具有去中心化许可证的应用商店,作者保留许可控制权,而不是平台。
- 一个数字图书馆,借阅由代币管理,归还由智能合约强制执行。
为什么会有这个东西存在?
这实际上是两个问题,让我们来分析一下...
为什么这个概念有用?
基于签名的身份验证避免了基于密码的身份验证的许多陷阱。服务器只需知道公钥,如果这些公钥泄露了...谁在乎呢?它们是公钥。
假设两种情况下都有合理的用户界面,用户可以像更改密码一样轻松地旋转密钥。他们可以将权限子集委托给其他密钥(就像我们在其他地方的访问令牌所做的那样)。
密钥是用户生成的,而不是用户记忆的。这消除了密码重复等问题。
为什么这种方法实用?
以代理的形式实现它允许它在不修改的情况下应用于大多数现有的HTTP(S)应用程序。
将签名与验证分开允许更细致地控制哪些可以访问私钥。这也意味着代理只能在需要的地方使用。如果客户端应用程序可以本地处理签名,那么它应该这么做。
将此作为一组可组合的中间件实现使得扩展变得简单,并且可以(负责任地)对新功能进行实验。
如果您喜欢这种类型的东西,它也可以作为一个sidecar容器部署。
我如何获得这个卓越的工具?
cargo install niftygate
或者,如果您喜欢Docker
docker pull colstrom/niftygate:0.8.0
我如何使用它?
首先,您需要一种服务,您希望将代理放在其前面。
为了演示和开发目的,niftygate
包含一个内嵌的示例服务,该服务将请求头打印在响应体中。
$ niftygate demo
tide::log Logger started
level DEBUG
tide::server Server listening on http://127.0.0.1:8080
接下来,您需要有一个Ethereum JSON-RPC (Web3)服务可供niftygate
交互。 Ganache是本地使用的优秀选择,因此本文档假设您将使用它。
首先,选择您想要用于签名的地址:
然后,找到此地址的私钥:
将此私钥添加到环境变量中
使用fish
set -x SECRET_KEY_DATA PUT_THE_DATA_HERE
使用老式shell,如bash
export SECRET_KEY_DATA=PUT_THE_DATA_HERE
现在您已经准备好运行了!让我们看看帮助信息
$ niftygate web3 --help
niftygate-web3 0.1.0
Runs the proxy service
USAGE:
niftygate web3 [FLAGS] [OPTIONS]
FLAGS:
-h, --help Prints help information
-V, --provides-account-verification verify signatures and provide account addresses
-B, --provides-balances provide account balances
-S, --provides-signatures provide signatures
--version Prints version information
OPTIONS:
--address-header <name> [env: ADDRESS_HEADER=] [default: X-Web3-Account-Address]
-b, --backend <url> [env: BACKEND=] [default: http://127.0.0.1:8080]
--balance-header <name> [env: BALANCE_HEADER=] [default: X-Web3-Account-Balance]
--balance-maximum <amount> [env: BALANCE_MAXIMUM=]
--balance-minimum <amount> [env: BALANCE_MINIMUM=]
-u, --balance-scale <unit> [env: BALANCE_SCALE=] [default: Wei]
-c, --challenge <phrase> [env: CHALLENGE=] [default: totes-legit]
-l, --listen <address> [env: LISTEN=] [default: 0.0.0.0:8000]
-K, --secret-key-data <hex> [env: SECRET_KEY_DATA=]
-k, --secret-key-file <path> [env: SECRET_KEY_FILE=]
--signature-header <name> [env: SIGNATURE_HEADER=] [default: X-Web3-Signature]
-w, --web3-rpc-url <url> [env: WEB3_RPC_URL=] [default: ws://127.0.0.1:7545]
所有这些选项都是可选的,尽管它不会做任何事情,除非您启用其中至少一个。让我们关注两个场景。
场景1 - 提供签名
在此模式下,niftygate
为其处理的每个请求添加一个签名。
$ niftygate web3 --provides-signatures
tide::log Logger started
level DEBUG
tracing::span new
tracing::span build
isahc::agent agent waker listening on 127.0.0.1:61558
isahc::agent agent_thread; port=61558
isahc::agent agent took 409.705µs to start up
tide::server Server listening on http://0.0.0.0:8000
需要秘密(私钥)来签署这些请求。它可以是文件(--secret-key-file
),或者十六进制字符串(--secret-key-data
)。如果都提供了,则忽略--secret-key-file
。这些也可以通过环境变量提供,这正是我们上面所做的那样。
此密钥用于签署一个挑战短语(目前由--challenge
提供),客户端和服务器都应该知道这个短语。它不需要是私有的。
此签名将使用--signature-header
提供的头添加到请求中。
场景2 - 提供账户验证
在此模式下,niftygate
期望请求包含一个签名头,并将拒绝不包含签名头的请求。这些头将被验证,用于签名的地址将添加到它处理的每个请求中。
请注意,客户端没有明确提供地址。他们签署一个双方都知道的挑战短语,签名地址可以从有效的签名中恢复。
$ niftygate web3 --provides-account-verification
tide::log Logger started
level DEBUG
tracing::span new
tracing::span build
isahc::agent agent waker listening on 127.0.0.1:56181
isahc::agent agent_thread; port=56181
isahc::agent agent took 312.747µs to start up
tide::server Server listening on http://0.0.0.0:8000
如果签名有效,将使用由 --address-header
提供的标头将地址添加到请求中。假设后端知道如何处理此标头。例如,您可以使用 X-Remote-User
标头将 niftygate
与 Dex 集成。
场景 3 - 提供账户余额
在此模式下,niftygate
预期请求包含一个账户标头,并将拒绝不包含此标头的请求。它将处理每个请求中提供的账户地址的余额。
$ niftygate web3 --provides-balances
tide::log Logger started
level DEBUG
tracing::span new
tracing::span build
isahc::agent agent waker listening on 127.0.0.1:54608
isahc::agent agent_thread; port=54608
isahc::agent agent took 313.524µs to start up
tide::server Server listening on http://0.0.0.0:8000
默认情况下,这不会关心余额是多少,它只是将其添加到由 --balance-header
提供的标头中。然而,有一些选项可以基于余额限制访问。
可以使用 --balance-minimum
选项要求最小余额。这可以作为“投入”的一种形式,要求非零余额(这可能在防止机器人或辅助速率限制时很有用),或者如果您有其他原因,可以仅允许大额存款者访问。
可以使用 --balance-maximum
选项拒绝余额超过指定金额的账户。这可以用来限制风险,或者如果您愿意,仅允许普通人访问。
可以使用 --balance-unit
选项方便地缩放上述限制。Gwei 中有多少个零?无需记住,只需设置 --balance-unit=Gwei
,niftygate
将在内部进行缩放。不过,余额标头仍然以 Wei 表示。
注意
上面的示例独立使用这些功能,但它们都是作为可组合的中间件实现的。您可以在单个进程中启用所有这些功能。在同一个进程中同时使用签名和验证可能有点荒谬,但您完全可以这样做。
试试吧!
假设您已启用所有功能,并且代理位于演示应用程序前面,如果您使用 curl
查询每个应用,您会看到以下内容
直接查询演示应用程序
$ curl -s http://127.0.0.1:8080 | sort
accept: ["*/*"]
host: ["127.0.0.1:8080"]
user-agent: ["curl/7.64.1"]
通过代理查询
$ curl -s http://127.0.0.1:8000 | sort
accept-encoding: ["deflate, gzip"]
accept: ["*/*"]
content-length: ["0"]
content-type: ["application/octet-stream"]
forwarded: ["by=127.0.0.1:8000;for=\"127.0.0.1:52698\";host=127.0.0.1:8000;proto=http"]
host: ["127.0.0.1:8000"]
user-agent: ["curl/7.64.1"]
x-web3-address: ["24f9f97c9e540fed57ef81f6c9aeabdb6fc73acd"]
x-web3-balance: ["100000000000000000000"]
x-web3-signature: ["krpQZO9WpgAEso2uk6eAKDy29QjeVtr+gdDZ7iG4bFkYiTfNvTvU5l4bb2iod5F4Ab8a8tJqzXHSXLkyz9U/gRs="]
智能合约
嵌入式预设
为了帮助您入门,niftygate
内置了来自 OpenZeppelin 项目的预设集。这些解决了某些更常见的用例,并且根据 OpenZeppelin 文档,它们是生产就绪的。
目前,包含五个预设以及部署和交互每个预设的实用程序。这些可以在 contract
子命令下找到。
为了帮助您确定哪个合约是合适的,请检查 guide
子命令。在那里,您将找到一个交互式程序,它会问您几个简单的问题,并为您提供建议。
路线图
- 0.1 - 初始发布,包含 Web3 账户验证
- 0.2 - 支持代币标准
- 0.3 - 智能合约的可观测性
- 0.5 - 支持可升级智能合约
- 0.6 - 从 sig-proxy 重命名为 NiftyGate
- 0.7 - TLS 支持
- 0.8 - 资产管理和(实验性)市场支持
愿望清单(不分顺序)
Infura 集成
- 用随机挑战替换固定消息,添加非ces和过期时间等。
可选端点以提供嵌入式脚本来支持浏览器。
- 使用Web Crypto API进行密钥生成和签名。
- 使用Web Storage API进行密钥存储。
- 使用Fetch API进行头部操作和认证流程。
X509 支持
- 这将在需要信任链模型的情况下提供一种替代方案。
PGP 支持
- 这将在需要信任网络模型的情况下提供一种替代方案。
许可
niftygate
在MIT许可下可用。有关完整文本,请参阅LICENSE.txt
。
niftygate
嵌入合约ABI规范,以及来自OpenZeppelin Contracts的文档摘录。这些也在MIT许可的条款下分发此处。
NiftyGate如何帮助我?
我已经有一个网站和一个智能合约
以服务器模式运行niftygate,给它你的网站地址和你的合约地址。
我有一个网站,但我不想使用智能合约
以服务器模式运行niftygate,给niftygate你的网站地址,它将允许用户使用他们的钱包登录。
我有一个非Web应用,我想与智能合约接口
将niftygate编译成库,并将其嵌入到你的应用程序中。
我有一个非Web应用,我不想修改我的代码。
以客户端模式运行niftygate,并将你的应用程序指向它。
我正在使用容器平台,如Docker或Kubernetes。
以客户端或服务器模式运行niftygate,作为边车容器部署。
我正在使用Kubernetes,并想将智能合约集成到控制器中。
使用contract events --stream
模式。这将输出匹配的事件作为紧凑的JSON在STDOUT上。
我没有智能合约,但我想有一个。
部署niftygate内置的合约之一,无需代码!
我不知道需要什么类型的智能合约。
使用niftygate内置的交互式向导。
我没有Ethereum节点可以连接。
在infura.io上注册账户,并将niftygate指向它。免费账户每天最多允许100k个请求,如果您需要更多,他们有付费计划。
我想使用私有区块链。
试试吧。niftygate的大部分开发都是在私有区块链上完成的。只要它支持通过WebSockets的JSON-RPC + Web3,它应该就可以。
Ganache和geth是不错的选择,具体取决于您的需求。
我想使用自己的身份平台。
以服务器模式运行niftygate,并告诉它应传递哪些头信息。
依赖项
~11–18MB
~214K SLoC