从链代码中的命令行请求获取 MSPID

Get MSPID from a command line request in chaincode

我目前正在尝试评估请求者 MSPID 以授权特定的成员列表能够在链代码上请求函数,但是当我请求 "stub.getCreator().mspId" 它总是给我 "undefined"

我目前正在通过 "docker exec" 之类的命令调用该函数。我检查过我的交易应该在 "getCreator" 之前签署才能工作,但我不知道是否可以通过命令行调用签署交易。

我的命令行请求是:

docker exec cli.example.com peer chaincode invoke -o orderer.example.com:7050 -C examplechannel -c '{"Args":["createVcc", "{ \"date\": 12345, \"reference\": \"anything\", \"serialNumber\": \"BR-12345\", \"presentedTo\": \"Example project\", \"quantity\": 22279 }"]}' -n example

验证函数:

const isAdmin = (func, creator) => {
    if (!adminList.includes(creator)) {
        throw new Error(`Organization ${creator} does not have access to perform function ${func}`);
    }
}

在链码中使用验证函数:

async (stub, data) => {
...
        isAdmin('createVcc', stub.getCreator().mspId);
...
}

我收到了:

Error: endorsement failure during invoke. response: status:500 message:"transaction returned with failure: Organization undefined does not have access to perform function createVcc"

我希望 "getCreator().mspid" 不会未定义,有人知道什么可以解决我的问题吗?

在我的代码段下方尝试

    const ClientIdentity = require('fabric-shim').ClientIdentity;

    let cid = new ClientIdentity(stub);

    let mspID = cid.getMSPID()

    let isAuthorized = false;

    if (cid.assertAttributeValue('createVcc', mspID){
        isAuthorized = true;
    }

使用 Node 链码(智能合约),您应该可以使用 Client Identity object 然后 getMSPID()getID()

如果您使用新编程模型 - 特别是 fabric-contract-api, then this includes the Client Identity object. Using this you can also check Attributes from the certificate allowing you more flexibility in your access control. There is a tutorial here 和最新的 Fabric 示例使用新编程模型。

您可能还想考虑使用 fabric-contract-api 提供的 beforeTransaction 并将其用作执行所有访问控制、检查函数名称和 "IDs".