如何使用MSP和Fabric-Ca-Client管理Hyperledger的用户身份验证?

时间:2019-08-30 08:11:53

标签: hyperledger-fabric blockchain hyperledger-fabric-ca

我正在开发基于Fabric 1.3的应用程序。我已经在多节点设置上建立了一个网络,连接了对等节点,实例化了链码,并使我的网络准备就绪,可以进行调用和查询。

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

我查看了官方文档: https://hyperledger-fabric-ca.readthedocs.io/en/latest/users-guide.html#registering-a-new-identity

我可以看到我们需要fabric-ca组件来注册用户并注册他们以进行查询。注册后,我们在〜/ .hfc-key-store下获得一个证书文件。

现在,我想了解如何继续进行流程。

用户在网络上注册:

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-key-store证书?由于这些证书将存储在运行Node脚本的服务器端,因此没有任何意义。

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

3 个答案:

答案 0 :(得分:0)

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

我要遵循的流程是,一旦注册了用户,就会创建用户证书,并将其登录凭据(如用户名和密码)存储在MongoDB中。

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

答案 1 :(得分:0)

当CA颁发身份(证书和密钥)时,该身份应保留给该特定用户以供以后进行交互(通过保存在客户端钱包中或其他方法),因此,如果删除该身份,则将重新注册每次登录时都会处理,这也会降低速度。

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

答案 2 :(得分:0)

也许有点晚,但也许可以帮助某人。我的方法是在登录时执行操作,在注册方法中,我返回证书和私钥,然后在登录时,用户需要提供生成的证书和私钥(以及证书和私钥) TLS连接的密钥),并使用此信息重新创建de Identity并将其存储在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);

希望有帮助