Hyperledger fabric 如何使用msp和fabric ca客户端管理hyperledger的用户身份验证?

Hyperledger fabric 如何使用msp和fabric ca客户端管理hyperledger的用户身份验证?,hyperledger-fabric,blockchain,hyperledger-fabric-ca,Hyperledger Fabric,Blockchain,Hyperledger Fabric Ca,我正在fabric 1.3上开发一个应用程序。我已经在多节点设置上构建了一个网络,连接了对等节点,实例化了链码,并准备好了网络以供调用和查询 现在,我正在考虑创建一个登录门户,用户可以通过它注册并执行调用/查询。我的所有同事和订购者都在云上,我计划使用在云实例上公开的节点SDK提供此登录功能 我查阅了官方文件: 我可以看出,我们需要fabric ca组件来注册用户并注册他们进行查询。注册后,我们将在~/.hfc密钥存储下获得证书文件 现在我想了解我应该如何继续我的流程 用户在网络上注册: fa

我正在fabric 1.3上开发一个应用程序。我已经在多节点设置上构建了一个网络,连接了对等节点,实例化了链码,并准备好了网络以供调用和查询

现在,我正在考虑创建一个登录门户,用户可以通过它注册并执行调用/查询。我的所有同事和订购者都在云上,我计划使用在云实例上公开的节点SDK提供此登录功能

我查阅了官方文件:

我可以看出,我们需要fabric ca组件来注册用户并注册他们进行查询。注册后,我们将在~/.hfc密钥存储下获得证书文件

现在我想了解我应该如何继续我的流程

用户在网络上注册:

fabric_ca_client.register({enrollmentID: 'user1', affiliation: 'org1.department1'}, admin_user)
用户使用其密码登录:

 fabric_ca_client.enroll({enrollmentID: 'user1', enrollmentSecret: secret});
}).then((enrollment) => {
  console.log('Successfully enrolled member user "user1" ');
  return fabric_client.createUser(
     {username: 'user1',
     mspid: 'Org1MSP',
     cryptoContent: { privateKeyPEM: enrollment.key.toBytes(), signedCertPEM: enrollment.certificate }
     });
}).then((user) => {
     member_user = user;
     return fabric_client.setUserContext(member_user);
以用户1的身份调用/查询:

var store_path = path.join(os.homedir(), '.hfc-key-store');
Fabric_Client.newDefaultKeyValueStore({ path: store_path
        }).then((state_store) => {
            // assign the store to the fabric client
            fabric_client.setStateStore(state_store);
            var crypto_suite = Fabric_Client.newCryptoSuite();
            // use the same location for the state store (where the users' certificate are kept)
            // and the crypto store (where the users' keys are kept)
            var crypto_store = Fabric_Client.newCryptoKeyStore({path: store_path});
            crypto_suite.setCryptoKeyStore(crypto_store);
            fabric_client.setCryptoSuite(crypto_suite);
            // get the enrolled user from persistence, this user will sign all requests
            return fabric_client.getUserContext('user1', true);
        }).then((user_from_store) => {
            if (user_from_store && user_from_store.isEnrolled()) {
                console.log('Successfully loaded user1 from persistence');
                member_user = user_from_store;
            } else {
                throw new Error('Failed to get user1.... run registerUser.js');
            }..
现在,当用户注销时,我该怎么办?是否删除~/.hfc密钥存储证书?因为这些证书将存储在运行节点脚本的服务器端,所以它没有意义


另外,我的流程是否正确,或者是否有更好的方法实现我的目标?

我有一个类似的登录实现,正如您所说,我为每个注册用户创建了证书,并将基本用户信息存储在MongoDB中。

我采用的流程是,用户注册后,将创建用户证书,并将其登录凭据(如用户名和密码)存储在MongoDB中。


当用户尝试重新登录时,我会检查MongoDB和证书,看看用户是否已经注册,一旦登录,用户将拥有一个auth令牌,然后可以使用它与fabric客户端交互。

我有一个类似的登录实现,我必须这样做,正如您所说,我为每个注册用户创建了证书,并将基本用户信息存储在MongoDB中。

我采用的流程是,用户注册后,将创建用户证书,并将其登录凭据(如用户名和密码)存储在MongoDB中。

当用户尝试重新登录时,我会检查MongoDB以及证书,以查看用户是否已经注册,一旦登录,用户将拥有一个身份验证令牌,然后可以使用该令牌与fabric客户端交互。

当身份(证书和密钥)出现时是由CA发布的,那么它应该为该特定用户保留,以便将来交互(通过保存在客户端钱包或其他方法),因此如果您删除它,则每次登录时都会有重新注册过程,并且会降低速度

解决它- 1.为登录和会话管理创建单独的逻辑,如JWT令牌。 2.将密钥和证书保存在服务器目录中(不是最好的方法,但以后可以使用) 让我知道它是否满足您的查询。

当CA发布身份(证书和密钥)时,应该为该特定用户保留该身份,以便将来进行交互(通过保存在客户端钱包或其他方法),因此如果您删除该身份,则每次登录时都会有重新注册过程,并且会降低速度

解决它- 1.为登录和会话管理创建单独的逻辑,如JWT令牌。 2.将密钥和证书保存在服务器目录中(不是最好的方法,但以后可以使用)
如果它满足您的查询,请告诉我。

可能会有点晚,但也许它可以帮助某人。我的方法是在登录时使用注册方法,返回证书和私钥,然后在登录时,用户需要提供生成的证书和私钥(以及TLS连接的证书和私钥),有了这些信息,我重新创建了去身份并将其存储在MemoryWallet中,现在有了这个MemoryWallet,我可以创建网关并连接到区块链

应该是这样的

const identity = X509WalletMixin.createIdentity(mspId, certificate, privateKey);
const identityTLS = X509WalletMixin.createIdentity(mspId, certificateTLS, privateKeyTLS);

const wallet = new InMemoryWallet();
await wallet.import(userId, identity);
await wallet.import(userId + '-tls', identityTLS);

const gateway = new Gateway();
await gateway.connect(ccpPath, { wallet, identity: userId, discovery: { enabled: true, asLocalhost: false } });
const client = gateway.getClient();
const userTlsCert = await wallet.export(userId + '-tls') as any;
client.setTlsClientCertAndKey(userTlsCert.certificate, userTlsCert.privateKey);

希望它能有所帮助

也许有点晚,但也许它能帮助别人。我的方法是在登录时使用注册方法,返回证书和私钥,然后在登录时,用户需要提供生成的证书和私钥(以及TLS连接的证书和私钥),有了这些信息,我重新创建了去身份并将其存储在MemoryWallet中,现在有了这个MemoryWallet,我可以创建网关并连接到区块链

应该是这样的

const identity = X509WalletMixin.createIdentity(mspId, certificate, privateKey);
const identityTLS = X509WalletMixin.createIdentity(mspId, certificateTLS, privateKeyTLS);

const wallet = new InMemoryWallet();
await wallet.import(userId, identity);
await wallet.import(userId + '-tls', identityTLS);

const gateway = new Gateway();
await gateway.connect(ccpPath, { wallet, identity: userId, discovery: { enabled: true, asLocalhost: false } });
const client = gateway.getClient();
const userTlsCert = await wallet.export(userId + '-tls') as any;
client.setTlsClientCertAndKey(userTlsCert.certificate, userTlsCert.privateKey);

除了下面的答案-1之外,希望它能有所帮助。建议使用新的编程模型,而不是Fabric 1.3-参见此处的概念、架构、应用程序开发方法()和Fabcar示例(注册+交互示例)2。您的应用程序用户在注销应用程序后不应删除区块链身份-用户下次(从应用程序)与区块链网络交互时,将再次使用其指定钱包(见文档)中的证书/密钥组合。除了下面的答案-1。建议使用新的编程模型,而不是Fabric 1.3-参见此处的概念、架构、应用程序开发方法()和Fabcar示例(注册+交互示例)2。您的应用程序用户在注销应用程序后不应删除区块链身份-用户下次(从应用程序)与区块链网络交互时,将再次使用其指定钱包(见文档)中的证书/密钥组合。嘿,感谢您的回复。我已经为前端和JAVA后端实现了okta层。我想确保用户也在区块链级别进行身份验证,这样我就可以确保他能够针对分配给他的角色执行特定的链码调用。好的,您可以向fabric ca查询该用户身份的特定角色。结构ca处理对指定