#requests #exonum #http-request #blockchain #authentication #http-header #http

nightly exonum-http-get-auth

通过AWS类似的头签名验证Exonum中的HTTP GET请求

1个不稳定版本

使用旧的Rust 2015

0.1.0 2017年11月5日

#22 in #exonum

MIT许可协议

7KB
64

exonum-http-get-auth

通过AWS类似的头签名验证Exonum中的HTTP GET请求。

Exonum已经具有验证POST的功能,因此您可以过滤添加到区块链的数据。此crate允许您验证读取。

请求验证基于对urlmethodtimestamp的签名(请求在签名后30秒内失效以防止重放攻击),并将签名放入http头中。

用法

extern crate exonum_http_get_auth;
use exonum_http_get_auth::get_auth::authenticate_request;

提供的authenticate_request()方法返回一个函数,该函数作为参数传递给routerget()处理程序

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