1个不稳定版本
使用旧的Rust 2015
0.1.0 | 2017年11月5日 |
---|
#22 in #exonum
7KB
64 行
exonum-http-get-auth
通过AWS类似的头签名验证Exonum中的HTTP GET请求。
Exonum已经具有验证POST的功能,因此您可以过滤添加到区块链的数据。此crate允许您验证读取。
请求验证基于对url、method和timestamp的签名(请求在签名后30秒内失效以防止重放攻击),并将签名放入http头中。
用法
extern crate exonum_http_get_auth;
use exonum_http_get_auth::get_auth::authenticate_request;
提供的authenticate_request()
方法返回一个函数,该函数作为参数传递给router
的get()
处理程序
router.get("/my_endpoint", authenticate_request(key, my_endpoint), "my_endpoint");
以及更通用的方式,如果您想使用相同的密钥验证多个请求
let auth = |f| authenticate_request(key, f);
router.get("/my_endpoint", auth(my_endpoint), "my_endpoint");
前端方面
正确的请求应该包含字段
x-date
以ISO8601格式表示的日期x-auth
64字节SHA256签名,用于连接的url+method+date
UTF-8数组(method
总是"GET"
)
示例
const Exonum = require('exonum-client');
const lib = require('./lib');
function toUTF8Array(str) {
var utf8 = [];
for (var i=0; i < str.length; i++) {
var charcode = str.charCodeAt(i);
if (charcode < 0x80) utf8.push(charcode);
else if (charcode < 0x800) {
utf8.push(0xc0 | (charcode >> 6),
0x80 | (charcode & 0x3f));
}
else if (charcode < 0xd800 || charcode >= 0xe000) {
utf8.push(0xe0 | (charcode >> 12),
0x80 | ((charcode>>6) & 0x3f),
0x80 | (charcode & 0x3f));
}
else {
//only handle chars up to U+FFFF
utf8.push(0xef, 0xbf, 0xbd);
}
}
return utf8;
}
const date = new Date().toISOString();
console.log(date);
const method = 'GET';
const address = 'http://127.0.0.1:8000/my_endpoint';
const keys = Exonum.keyPair();
const data = toUTF8Array(address+method+date);
const signature = Exonum.sign(keys, data);
var reqHeaders = new Headers();
reqHeaders.append('x-date', date);
reqHeaders.append('x-auth', signature);
var options = { method: method,
headers: reqHeaders,
mode: "cors" };
var authRequest = new Request(address, options);
fetch(authRequest)
.then(result => {
console.log(result.json());
})
.catch(error => {
console.log(error);
});
依赖项
~23–33MB
~496K SLoC