Hyperledger Fabric Composer-Rest-Server如何设置用户名/密码验证?

问题描述 投票:0回答:1

首先,我对hyperledger很新,可能在某些地方我错了。

现在,我正在开发一个我正在使用Hyperledger Fabric,Hyperledger Composer和hyperledger-rest-server的应用程序。

现在我读一下有关身份验证过程的内容,但我一度陷入困境。

在我回答我的问题之前,我会告诉你更多关于我想要的东西:

我想创建一个带角度的前端应用程序,用户可以使用他的用户名/密码登录。

我读到的是我可以使用Passport.js进行hyperledger-rest-server身份验证。但我的理解是,这是用于与第三方如twitter,facebook等进行身份验证。

我的问题:

  • 我的想法在这里是否正确?
  • 这可能吗?
  • 我怎样才能做到这一点?
  • 用户是否也可以更改密码?
  • 使用Passport.js,管理员如何定义Facebook帐户,例如哪个帐户?我的意思是hyperledger需要知道我的Facebook帐户属于我的Hyperledger Fabric帐户。
passport.js hyperledger-fabric hyperledger hyperledger-composer
1个回答
0
投票

是的,这是一个这样的选择,完全可行。你可以使用passportjscomposer-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和身份验证。

  1. 创建参与者并导入身份
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();
}
  1. 使用您自己的数据库存储用户的用户名和密码。将它映射到composer card。对于这个例子,我使用了mongoDB。架构将是这样的
let newUser = new userSchema({
      username: 'Alice,
      password: 'topSecretPassword,
      emailId: '[email protected]',
      participantId: 'username123,
      composerCard: `username123@my-network`
});
  1. 中间件(最重要的)。因此,当Alice登录时,系统将返回一个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 });
}
  1. 实际的API调用。所以这基本上是一个中间件函数,它检查令牌并决定使用哪个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。

© www.soinside.com 2019 - 2024. All rights reserved.