Да, это один из таких вариантов, который вполне осуществим.Вы можете использовать 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 и аутентификацию.
- Создать участника и импортировать удостоверение личности
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, используя эту же систему.