首先,我对hyperledger很新,可能在某些地方我错了。
现在,我正在开发一个我正在使用Hyperledger Fabric,Hyperledger Composer和hyperledger-rest-server的应用程序。
现在我读一下有关身份验证过程的内容,但我一度陷入困境。
在我回答我的问题之前,我会告诉你更多关于我想要的东西:
我想创建一个带角度的前端应用程序,用户可以使用他的用户名/密码登录。
我读到的是我可以使用Passport.js进行hyperledger-rest-server身份验证。但我的理解是,这是用于与第三方如twitter,facebook等进行身份验证。
我的问题:
是的,这是一个这样的选择,完全可行。你可以使用passportjs
和composer-rest-server
并将username
链接到一个独特的composer business card
。这样,当用户登录时,它从服务器获取令牌。每个后续API调用都必须具有令牌,基于此,其余服务器将使用所需的composer card
您首先需要follow this并使用composer-rest-server -c ADMIN_CARD_NAME
设置您的服务器。然后,您需要激活服务器的身份验证。转到http://0.0.0.0:3000/explorer查看API,包括用于身份验证的API。
根据身份验证方法,您需要安装所需的包。 This tutorial是一个很好的起点。使用wallet import
端点,管理员可以将Facebook帐户或用户名映射到特定的composer card
。
现在我的诚实意见是,composer-rest-server
不适合试点/生产推广。我已经使用过这个并最终决定处理我自己的API和身份验证。
async function createParticipant() {
const businessNetworkConnection = new BusinessNetworkConnection();
await businessNetworkConnection.connect(adminCardName);
let registry= await businessNetworkConnection.getParticipantRegistry(`${BASE_NS}.SampleUser`);
const factory = businessNetworkConnection.getBusinessNetwork().getFactory();
let user= factory.newResource(BASE_NS, 'SampleUser', 'username123');
await businessNetworkConnection.save(user);
// User is registered, time to import an identity
let creds = await businessNetworkConnection.issueIdentity(`${BASE_NS}.SampleUser#username123`, 'username123);
const adminConnection = new AdminConnection();
await adminConnection.connect(adminCardName);
const card = new IdCard({
userName: creds.userID,
version: 1,
enrollmentSecret: creds.userSecret,
businessNetwork: businessName
}, connectionProfile);
await adminConnection.importCard(`username123@my-network`, card);
await adminConnection.disconnect();
await businessNetworkConnection.disconnect();
}
composer card
。对于这个例子,我使用了mongoDB。架构将是这样的let newUser = new userSchema({
username: 'Alice,
password: 'topSecretPassword,
emailId: '[email protected]',
participantId: 'username123,
composerCard: `username123@my-network`
});
jsonwebtoken
,她必须在所有后续的API调用中使用它。const jwt = require('jsonwebtoken');
app.post('/login', auth());
async function auth(req, res, next) {
let username = req.body.username;
let password = req.body.password;
// User whatever authentication method you want here and return a jwt
// In my project I created a new token db and kept a mapping
const authToken = jwt.sign(tokenSeed, jwtSecret, { });
const newToken = new tokenSchema({
authToken: authToken,
username: req.body.username
});
await newToken.save();
res.send({ authToken: authToken, username: username });
}
composer card
进行交易const chooseCard = async (req, res, next) => {
// Retrieve the token from the DB
let token = await tokenSchema.findOne({ authToken: req.headers['x-access-token'] });
// Get the user information
let user = await userSchema.findOne({ username: token.username });
let card = user.composerCard;
req.composerCardToUse = card;
next();
};
const someFancyTx = async (req, res, next) => {
let card = req.composerCardToUse;
await businessNetworkConnection.connect(card);
// And the transactions submitted with this instance will use the required card
}
app.post('/sendMoney', chooseCard, somefancyTx);
注意:我已经跳过了一些验证步骤(检查jwt的真实性,用户会话)并跳过了一些样板代码,这些代码会使得这个答案不必要地长。我使用同一系统成功运行了一个试验和一个PoC。