Hyperledger Fabric SDK 示例fabric-samples-《balance-transfer》之一《注册用户》
2017-10-16 15:14
651 查看
本文已在我的公众号BigManing_blog原创首发。
转载请标明出处:
https://blog.csdn.net/qq_27818541/article/details/78250055
本文出自:【BigManing的博客】
从上面得知要看具体实现,还需要进入
基本流程 :
Created with Raphaël 2.1.2开始设置公私钥路径user是否存在?返回用户结束registe/enroll用户获取Adminregister userenroll user设置UserContextyesno
控制面板打印结果:
可以看出
node服务后台打印:
转载请标明出处:
https://blog.csdn.net/qq_27818541/article/details/78250055
本文出自:【BigManing的博客】
前言
上一篇文章我们已经启动了fabric网络/node服务,这篇文章主要来详细分析用户注册的过程。具体实现
找到app.js中关于users的路由:
//注册用户 app.post('/users', function(req, res) { // 1 参数校验 var username = req.body.username; var orgName = req.body.orgName; logger.debug('End point : /users'); logger.debug('User name : ' + username); logger.debug('Org name : ' + orgName); if (!username) { res.json(getErrorMessage('\'username\'')); return; } if (!orgName) { res.json(getErrorMessage('\'orgName\'')); return; } // 2 生成jwt 添加用户名以及组织信息 var token = jwt.sign({ exp: Math.floor(Date.now() / 1000) + parseInt(hfc.getConfigSetting('jwt_expiretime')), username: username, orgName: orgName }, app.get('secret')); // 3 注册用户 如果成功连同jwt一起返回 helper.getRegisteredUsers(username, orgName, true).then(function(response) { if (response && typeof response !== 'string') { response.token = token; res.json(response); } else { res.json({ success: false, message: response }); } }); });
从上面得知要看具体实现,还需要进入
helper.js中查看
getRegisteredUsers():
var getRegisteredUsers = function(username, userOrg, isJson) { var member; var client = getClientForOrg(userOrg); var enrollmentSecret = null; // 设置公私钥存储的地方 return hfc.newDefaultKeyValueStore({ // 这里只要求path参数 来作为存储的地方 path: getKeyStoreForOrg(getOrgName(userOrg)) }).then((store) => { // 设置状态持久化存储(如(证书,私钥。。)) client.setStateStore(store); // clearing the user context before switching client._userContext = null; //1 获取用户信息 (从 内存-->statestore 依次查找) return client.getUserContext(username, true).then((user) => { if (user && user.isEnrolled()) { // 从持久化中 成功加载此 user logger.info('Successfully loaded member from persistence'); return user; } else { let caClient = caClients[userOrg]; //2 获得adminuser 来注册账户 return getAdminUser(userOrg).then(function(adminUserObj) { member = adminUserObj; return caClient.register({ enrollmentID: username, // 与此用户关联的隶属关系 affiliation: userOrg + '.department1' }, member); // 注册员 }).then((secret) => { enrollmentSecret = secret; logger.debug(username + ' registered successfully'); //3 注册成功后 拿着secret 来enroll return caClient.enroll({ enrollmentID: username, enrollmentSecret: secret }); }, (err) => { logger.debug(username + ' failed to register'); return '' + err; //return 'Failed to register '+username+'. Error: ' + err.stack ? err.stack : err; }).then((message) => { // enroll 返回的信息 if (message && typeof message === 'string' && message.includes( 'Error:')) { logger.error(username + ' enrollment failed'); return message; } logger.debug(username + ' enrolled successfully'); // 构建user对象 member = new User(username); member._enrollmentSecret = enrollmentSecret; //4 设置此User实例的注册对象 来持久化在client中 return member.setEnrollment(message.key, message.certificate, getMspID(userOrg)); }).then(() => { //5 保存用户的上下文环境(e.g 证书 私钥 ) 用户签名 各种请求 client.setUserContext(member); return member; }, (err) => { logger.error(util.format('%s enroll failed: %s', username, err.stack ? err.stack : err)); return '' + err; });; } }); }).then((user) => { // 6 返回用户信息 if (isJson && isJson === true) { var response = { success: true, secret: user._enrollmentSecret, message: username + ' enrolled Successfully', }; return response; } return user; }, (err) => { logger.error(util.format('Failed to get registered user: %s, error: %s', username, err.stack ? err.stack : err)); return '' + err; }); };
基本流程 :
Created with Raphaël 2.1.2开始设置公私钥路径user是否存在?返回用户结束registe/enroll用户获取Adminregister userenroll user设置UserContextyesno
API访问
为org1组织建立一个用户名为
Jim的用户。在命令行里输入:
echo "POST request Enroll on Org1 ..." echo ORG1_TOKEN=$(curl -s -X POST \ http://localhost:4000/users \ -H "content-type: application/x-www-form-urlencoded" \ -d 'username=Jim&orgName=org1') echo $ORG1_TOKEN
控制面板打印结果:
POST request Enroll on Org1 ... {"success":true,"secret":"xDfluXIPURbu","message":"Jim enrolled Successfully","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MDgxNTkyMjQsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE1MDgxMjMyMjR9.rE5UuViSzmDcdHNZRXt22izpopY5eVkJ7YbfXILjSQk"} ORG1 token is eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MDgxNTkyMjQsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE1MDgxMjMyMjR9.rE5UuViSzmDcdHNZRXt22izpopY5eVkJ7YbfXILjSQk // 上面的token是 访问后面API的必要参数
可以看出
Jim已经成功被注册了,其公私钥存放在
/tmp/fabric-client-kvs_peerOrg1中(可在
config.json中自定义
keyValueStore路径):
node服务后台打印:
[2017-10-16 11:07:04.222] [DEBUG] SampleWebApp - End point : /users [2017-10-16 11:07:04.222] [DEBUG] SampleWebApp - User name : Jim [2017-10-16 11:07:04.222] [DEBUG] SampleWebApp - Org name : org1 [2017-10-16 11:07:04.226] [DEBUG] Helper - [FileKeyValueStore.js]: FileKeyValueStore.js - constructor [2017-10-16 11:07:04.228] [DEBUG] Helper - [FileKeyValueStore.js]: FileKeyValueStore -- getValue [2017-10-16 11:07:04.230] [DEBUG] Helper - [FileKeyValueStore.js]: FileKeyValueStore.js - constructor [2017-10-16 11:07:04.231] [DEBUG] Helper - [FileKeyValueStore.js]: FileKeyValueStore -- getValue //----->公私钥存放路径 [2017-10-16 11:07:04.310] [DEBUG] Helper - [utils.CryptoKeyStore]: This class requires a CryptoKeyStore to save keys, using the store: {"opts":{"path":"/tmp/fabric-client-kvs_peerOrg1"}} [2017-10-16 11:07:04.311] [DEBUG] Helper - [FileKeyValueStore.js]: FileKeyValueStore.js - constructor [2017-10-16 11:07:04.311] [DEBUG] Helper - [utils.CryptoKeyStore]: _getKeyStore returning ks [2017-10-16 11:07:04.312] [DEBUG] Helper - [crypto_ecdsa_aes]: generateKey, store.setValue [2017-10-16 11:07:04.313] [DEBUG] Helper - [ecdsa/key.js]: ECDSA curve param X: 5f8df5637db9f5e75af2990de09b57214b1eefcf834002cd79e6e7a634a23b68 [2017-10-16 11:07:04.313] [DEBUG] Helper - [ecdsa/key.js]: ECDSA curve param Y: bc8ce6511008bff20bb18ad6f105af889eb3c880cd2275cd97184d3378c47751 [2017-10-16 11:07:04.319] [DEBUG] Helper - [FileKeyValueStore.js]: FileKeyValueStore -- setValue //----->获取admin [2017-10-16 11:07:04.715] [INFO] Helper - Successfully enrolled user 'admin' [2017-10-16 11:07:04.716] [DEBUG] Helper - Msp ID : Org1MSP [2017-10-16 11:07:04.717] [DEBUG] Helper - [crypto_ecdsa_aes]: importKey - start [2017-10-16 11:07:04.721] [DEBUG] Helper - [crypto_ecdsa_aes]: importKey - have the key [Circular] [2017-10-16 11:07:04.722] [DEBUG] Helper - [utils.CryptoKeyStore]: _getKeyStore resolving store [2017-10-16 11:07:04.723] [DEBUG] Helper - [ecdsa/key.js]: ECDSA curve param X: 5f8df5637db9f5e75af2990de09b57214b1eefcf834002cd79e6e7a634a23b68 [2017-10-16 11:07:04.723] [DEBUG] Helper - [ecdsa/key.js]: ECDSA curve param Y: bc8ce6511008bff20bb18ad6f105af889eb3c880cd2275cd97184d3378c47751 [2017-10-16 11:07:04.724] [DEBUG] Helper - [FileKeyValueStore.js]: FileKeyValueStore -- setValue [2017-10-16 11:07:04.726] [DEBUG] Helper - [ecdsa/key.js]: ECDSA curve param X: 5f8df5637db9f5e75af2990de09b57214b1eefcf834002cd79e6e7a634a23b68 [2017-10-16 11:07:04.726] [DEBUG] Helper - [ecdsa/key.js]: ECDSA curve param Y: bc8ce6511008bff20bb18ad6f105af889eb3c880cd2275cd97184d3378c47751 [2017-10-16 11:07:04.727] [DEBUG] Helper - [ecdsa/key.js]: ECDSA curve param X: 5f8df5637db9f5e75af2990de09b57214b1eefcf834002cd79e6e7a634a23b68 [2017-10-16 11:07:04.727] [DEBUG] Helper - [ecdsa/key.js]: ECDSA curve param Y: bc8ce6511008bff20bb18ad6f105af889eb3c880cd2275cd97184d3378c47751 [2017-10-16 11:07:04.728] [DEBUG] Helper - [ecdsa/key.js]: ECDSA curve param X: 5f8df5637db9f5e75af2990de09b57214b1eefcf834002cd79e6e7a634a23b68 [2017-10-16 11:07:04.728] [DEBUG] Helper - [ecdsa/key.js]: ECDSA curve param Y: bc8ce6511008bff20bb18ad6f105af889eb3c880cd2275cd97184d3378c47751 [2017-10-16 11:07:04.728] [DEBUG] Helper - [FileKeyValueStore.js]: FileKeyValueStore -- setValue [2017-10-16 11:07:04.743] [DEBUG] Helper - [crypto_ecdsa_aes]: ecdsa signature: Signature { r: <BN: f1034e3347d230585a94f1ea21318d6217a20774754798641f599e33b8a9571f>, s: <BN: 5e4d05280fe82c2bbe93eb0e8fefb8998bacf160b6422e370b561c109b1c0ef2>, recoveryParam: 0 } //-----> Jim register 成功 [2017-10-16 11:07:04.950] [DEBUG] Helper - Jim registered successfully [2017-10-16 11:07:05.033] [DEBUG] Helper - [utils.CryptoKeyStore]: _getKeyStore resolving store [2017-10-16 11:07:05.034] [DEBUG] Helper - [crypto_ecdsa_aes]: generateKey, store.setValue [2017-10-16 11:07:05.034] [DEBUG] Helper - [ecdsa/key.js]: ECDSA curve param X: b3e2a75b9a4fd2b081589b1c45bde49f583aea9d7d466798c7b765c4ca96973d [2017-10-16 11:07:05.034] [DEBUG] Helper - [ecdsa/key.js]: ECDSA curve param Y: c58820e5a9db75ab17841ac158e9389ad0d130a6827dc0682dcb2d2c5dccb349 //-----> Jim enrolled 成功 [2017-10-16 11:07:05.391] [DEBUG] Helper - Jim enrolled successfully [2017-10-16 11:07:05.391] [DEBUG] Helper - Msp ID : Org1MSP [2017-10-16 11:07:05.392] [DEBUG] Helper - [crypto_ecdsa_aes]: constructor, keySize: 256 [2017-10-16 11:07:05.392] [DEBUG] Helper - [crypto_ecdsa_aes]: Hash algorithm: SHA2, hash output size: 256 [2017-10-16 11:07:05.392] [DEBUG] Helper - [utils.CryptoKeyStore]: CryptoKeyStore, constructor - start [2017-10-16 11:07:05.393] [DEBUG] Helper - [utils.CryptoKeyStore]: constructor, no super class specified, using config: fabric-client/lib/impl/FileKeyValueStore.js [2017-10-16 11:07:05.393] [DEBUG] Helper - [crypto_ecdsa_aes]: importKey - start [2017-10-16 11:07:05.393] [DEBUG] Helper - [crypto_ecdsa_aes]: importKey - have the key [Circular] [2017-10-16 11:07:05.393] [DEBUG] Helper - [utils.CryptoKeyStore]: This class requires a CryptoKeyStore to save keys, using the store: {"opts":{"path":"/home/jiang/.hfc-key-store"}} [2017-10-16 11:07:05.393] [DEBUG] Helper - [FileKeyValueStore.js]: FileKeyValueStore.js - constructor [2017-10-16 11:07:05.394] [DEBUG] Helper - [utils.CryptoKeyStore]: _getKeyStore returning ks [2017-10-16 11:07:05.394] [DEBUG] Helper - [ecdsa/key.js]: ECDSA curve param X: b3e2a75b9a4fd2b081589b1c45bde49f583aea9d7d466798c7b765c4ca96973d [2017-10-16 11:07:05.394] [DEBUG] Helper - [ecdsa/key.js]: ECDSA curve param Y: c58820e5a9db75ab17841ac158e9389ad0d130a6827dc0682dcb2d2c5dccb349 [2017-10-16 11:07:05.395] [DEBUG] Helper - [FileKeyValueStore.js]: FileKeyValueStore -- setValue [2017-10-16 11:07:05.396] [DEBUG] Helper - [ecdsa/key.js]: ECDSA curve param X: b3e2a75b9a4fd2b081589b1c45bde49f583aea9d7d466798c7b765c4ca96973d [2017-10-16 11:07:05.397] [DEBUG] Helper - [ecdsa/key.js]: ECDSA curve param Y: c58820e5a9db75ab17841ac158e9389ad0d130a6827dc0682dcb2d2c5dccb349 [2017-10-16 11:07:05.398] [DEBUG] Helper - [ecdsa/key.js]: ECDSA curve param X: b3e2a75b9a4fd2b081589b1c45bde49f583aea9d7d466798c7b765c4ca96973d [2017-10-16 11:07:05.398] [DEBUG] Helper - [ecdsa/key.js]: ECDSA curve param Y: c58820e5a9db75ab17841ac158e9389ad0d130a6827dc0682dcb2d2c5dccb349 [2017-10-16 11:07:05.399] [DEBUG] Helper - [ecdsa/key.js]: ECDSA curve param X: b3e2a75b9a4fd2b081589b1c45bde49f583aea9d7d466798c7b765c4ca96973d [2017-10-16 11:07:05.400] [DEBUG] Helper - [ecdsa/key.js]: ECDSA curve param Y: c58820e5a9db75ab17841ac158e9389ad0d130a6827dc0682dcb2d2c5dccb349 [2017-10-16 11:07:05.400] [DEBUG] Helper - [FileKeyValueStore.js]: FileKeyValueStore -- setValue
相关文章推荐
- Hyperledger Fabric SDK 示例fabric-samples-《balance-transfer》之十二《查询已经加入的channel名称》
- Hyperledger Fabric SDK 示例 fabric-samples-《balance-transfer》之简介
- Hyperledger Fabric SDK 示例fabric-samples-《balance-transfer》之六《执行chaincode》
- Hyperledger Fabric SDK 示例fabric-samples-《balance-transfer》之九《查询指定的交易信息》
- Hyperledger Fabric SDK 示例fabric-samples-《balance-transfer》之三《加入到Channel》
- Hyperledger Fabric SDK 示例fabric-samples-《balance-transfer》之十《查询链信息》
- Hyperledger Fabric SDK 示例fabric-samples-《balance-transfer》之二《创建Channel》
- Hyperledger Fabric SDK 示例fabric-samples-《balance-transfer》之七《查询chaincode》
- Hyperledger Fabric SDK 示例fabric-samples-《balance-transfer》之十一《查询已经安装/实例化的chaincode》
- Hyperledger Fabric SDK 示例fabric-samples-《balance-transfer》之五《初始化chaincode》
- Hyperledger Fabric SDK 示例fabric-samples-《balance-transfer》之八《查询指定的区块信息》
- Hyperledger Fabric SDK 示例fabric-samples-《balance-transfer》之四《安装chaincode》
- 《ArcGIS Runtime SDK for Android开发笔记》——(7)、示例代码arcgis-runtime-samples-android的使用
- python fabric实现远程操作和部署示例
- PHP header函数设置http报文头示例详解以及解决http返回头中content-length与Transfer-Encoding: chunked的问题
- 《ArcGIS Runtime SDK for Android开发笔记》——(7)、示例代码arcgis-runtime-samples-android的使用
- Visual Studio 2010 Samples(Visual Studio 2010 示例)
- Hyperledger Fabric Samples 建立第一个网络
- 如何编译wxWidgets示例程序(samples目录下的程序)
- Google VR SDK for Android(2)- Download and Samples(下载和示例)