menu

NodeJS

更新时间: 2019-12-24 18:10:38 · 编辑者:宇链科技

概述

我们提供了基于 NodeJS 的签名样例代码,你可以方便地使用它来调用宇链区块链可信云的各类功能。

使用说明

首先,在你的项目中新建一个 httpHelper.js 的文件,并键入以下内容:

/**
 * 提供一个对 HTTP 接口进行签名和验签的标准实现。
 */
const crypto = require("crypto");
const util = require("util");

module.exports = {
    getHttpSignature({ appId, appSecret, httpMethod, httpPath, query, body, timeStamp }) {
        if (!timeStamp) {
            timeStamp = new Date().valueOf();
        }

        if (!appId || !appSecret || !httpPath) {
            throw new Error("appId / appSecret / httpPath should not be null");
        }
        if (appSecret.length < 16) {
            throw new RangeError("appSecret is too short");
        }

        // URI 和动词行
        let textForSigning = httpMethod.toUpperCase() + " " + httpPath + "\n";
        query = query || {};

        const queryArr = [];
        for (const q in query) {
            if (q !== "_s") {
                queryArr.push([q, query[q]]);
            }
        }
        if (!query._appid) {
            queryArr.push(["_appid", appId]);
        }
        if (!query._t) {
            queryArr.push(["_t", timeStamp]);
        }

        queryArr.sort((x, y) => String(x[0]) > String(y[0]) ? 1 : -1);

        for (let i = 0; i < queryArr.length; ++i) {
            queryArr[i] = queryArr[i][0] + "=" + queryArr[i][1];
        }

        // query 行
        textForSigning += queryArr.join("&");

        // body 行
        if (body) {
            textForSigning += ("\n" + body);
        }

        // 签名
        const signature = crypto.createHmac("sha256", appSecret).update(textForSigning).digest().toString("hex");

        return {
            signature,
            timeStamp
        };
    }
};

在调用具体的 API 接口时,请遵循下列步骤:

  1. 在宇链云的 API 参考中找到对应 API 的 接口地址参数返回值说明
  2. 引用 httpHelper
  3. 调用 getHttpSignature 方法进行签名。
  4. 使用你钟爱的 HTTP 请求库请求接口,并附带上一步骤所计算出的签名。

代码样例


// 引入
const httpHelper = require("./httpHelper");

// 计算签名
const ret = httpHelper.getHttpSignature({
    appId: 'xxxx',
    appSecret: 'xxxx',
    httpMethod: 'POST',
    httpPath: '/common-chain-upload',
    query: {
        // 请求的 query 参数字典,例如:
        a: 'b'
    },
    body: JSON.stringify({
        // 请求参数,例如:
        type: 'data-item-create'
    })
});

// 输出签名结果
console.log(ret);

// 根据签名结果调用 API(略)