Hyperledger Fabric Composer-Rest-Server, как настроить аутентификацию по имени пользователя и паролю? - PullRequest
0 голосов
/ 20 февраля 2019

Прежде всего, я очень плохо знаком с hyperledger и, возможно, я где-то не так думаю.

Сейчас я работаю над приложением, которое делаю с Hyperledger Fabric, Hyperledger Composer и hyperledger.-rest-server.

Теперь я немного прочитал о процессе аутентификации, но застрял в одной точке.

Прежде чем я задам свои вопросы, я расскажу вам немного больше о том, что яwant:

Я хочу создать веб-приложение с angular, где пользователь может войти в систему со своим именем пользователя / паролем.

Я прочитал, что я могу использовать Passport.js для hyperledger-restаутентификация на сервере.Но что я понял, так это то, что это для аутентификации с третьими лицами, такими как твиттер, фейсбук и т. Д.

Мои вопросы:

  • Правильно ли мое мышление здесь?
  • Возможно ли это?
  • Как я могу это сделать?
  • Возможно ли для пользователя изменить свой пароль?
  • С Passport.js как администратор определяеткакая учетная запись Facebook, например, для какой учетной записи?Я имею в виду, что hyperledger должен знать, что моя учетная запись Facebook принадлежит моей учетной записи Hyperledger Fabric.

1 Ответ

0 голосов
/ 21 февраля 2019

Да, это один из таких вариантов, который вполне осуществим.Вы можете использовать passportjs с composer-rest-server и связать username с уникальным composer business card.Таким образом, когда пользователь входит в систему, он получает токен с сервера.Каждый последующий вызов API должен иметь токен, исходя из этого, остальные серверы будут использовать необходимые composer card

. Сначала вам нужно будет следовать этому и настроить свой сервер с помощью composer-rest-server -c ADMIN_CARD_NAME.Затем вам нужно будет активировать аутентификацию для сервера.Перейдите на http://0.0.0.0:3000/explorer для просмотра API, в том числе для аутентификации.

В зависимости от метода аутентификации вам потребуется установить требуемый пакет. Этот урок - отличное место для начала.Используя конечную точку 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();
}
Используйте свою собственную БД для хранения имени пользователя и пароля для пользователя.Сопоставьте это с composer card.Для этого примера я использовал mongoDB.Схема будет выглядеть примерно так:
let newUser = new userSchema({
      username: 'Alice,
      password: 'topSecretPassword,
      emailId: 'foo@bar.com',
      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 });
}
Фактический вызов 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, используя эту же систему.

...