“SIWC” - Ваш новый стандарт аутентификации Web3 вместе с Conflux.
@confluxrussians

«Вход с помощью Conflux»(Sign in with Conflux, далее SIWC)— это новый Web3 стандарт, благодаря которому появилась возможность аутентификации входа в онлайн сервисы с помощью адреса блокчейн сети, а не используя привычный всем нам, метод пары: «логин+пароль»
Данный стандарт описывает метод аутентификации адресов сети Conflux, посредством офф-чейн сервисов, подписывая сообщения стандартного формата с указанием параметров области применения, деталями сессии и механизмами безопасности(например, такими как nonce).
Цели данной спецификации — предоставить полноценную альтернативу централизованным сервисам идентификации, улучшить взаимодействие между офф-чейн сервисами аутентификации на основе сети Conflux и предоставить операторам Web3 кошельков и децентрализованных приложений (dApp) согласованный машиночитаемый формат сообщений для улучшения взаимодействия с пользователями и управления разрешениями и согласием.
Стандарт SIWC написан на основе стандарта “Sign In with Ethereum”(Вход с помощью Ethereum).
Вы можете легко и быстро добавить поддержку стандарта SIWC в свой собственный проект, с помощью библиотеки npm.
Руководство по добавлению SIWC
Для того,чтобы добавить SIWC в ваш проект, предварительно установите библиотеку npm и выполните следующие команды:
npm i siwc
npm i siwc-parser
Если Вы используете yarn, выполните:
yarn add siwc
yarn add siwc-parser
Стандарт SIWC совместим с большинством EVM HD кошельков, в том числе с кошельками Fluent и MetaMask.
Сценарии реализаций SIWC описаны в SIWC QuickStart.
SIWC Quickstart — это базовая простейшая реализация клиент/сервер, которая поможет разработчикам запустить и ознакомится с примерами сценариев SIWC в режиме реального времени.
После того, как Вы добавите поддержку SIWC в ваш проект, вам потребуется сигнатура(подпись) для аутентификации с онлайн сервисами и приложениями. Получить сигнатуру возможно посредством подписи сообщения вашего адреса сети Conflux.

Процедуру верификации сигнатуры можно выполнить посредством API. В случае если сигнатура указана верно, API вернет вам ответ: “true”
В SIWC Quickstarter доступно примеры четырёх сценариев:
00_print
Печатает в консоли пример простейшего сообщения входа.
01_interface
Пример реализации сценария создания сигнатуры и ее верификации стороны на Javascript.
02_backend
Пример реализации сценария проверки сигнатуры посредством API в NodeJS.
03_complete_app
Пример простого полноценного приложения со сценарием входа на Frontend и verification/getInfromations API для backend.
Реализация
В вашем проекте вы можете использовать SIWC, следуя нижеприведенному примеру:
Frontend с Conflux eSpace
Простейшее сообщения входа и верификация на Conflux eSpace.
const message = await createSiwcMessage(
await signer.getAddress(),
'Sign in with Conflux to the app.'
);
const signature = await signer.signMessage(message);
fetch(`${BACKEND_ADDR}/verify`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ message, signature, 'espace' }),
credentials: 'include',
});
Frontend c Conflux Core
Простейшее сообщение входа и верификация на Conflux Core
const message = await createSiwcMessage(
{accountId},
'Sign in with Conflux to the app.',
{chain ID}
);
const signature = await window.conflux.request({
method: `personal_sign`,
params: [message, {accountId}],
});
fetch(`${BACKEND_ADDR}/verify`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ message, signature, 'core' }),
credentials: 'include',
});
Примечание: accountId — открытый ключ, ваш адрес в сети Conflux, chainID — 1 для тестовой сети и 1029 для основной сети.
Backend
Данный пример описывает сценарий проверки соответствия сигнатуры с сообщением для входа.
app.post('/verify', async function (req, res) {
try {
if (!req.body.message) {
res.status(422).json({
message: 'Expected prepareMessage object as body.',
});
return;
}
let message = new SiwcMessage(req.body.message);
const { space } = req.body;
const spaceEnum =
space === 'core' ? Space.CONFLUX_CORE : Space.CONFLUX_E_SPACE;
const fields = await message.validate(req.body.signature, spaceEnum);
if (fields.nonce !== req.session.nonce) {
console.log(req.session);
res.status(422).json({
message: `Invalid nonce.`,
});
return;
}
req.session.siwc = fields;
req.session.cookie.expires = new Date(fields.expirationTime);
req.session.save(() => res.status(200).end());
} catch (e) {
req.session.siwc = null;
req.session.nonce = null;
console.error(e);
switch (e) {
case ErrorTypes.EXPIRED_MESSAGE: {
req.session.save(() =>
res.status(440).json({ message: e.message })
);
break;
}
case ErrorTypes.INVALID_SIGNATURE: {
req.session.save(() =>
res.status(422).json({ message: e.message })
);
break;
}
default: {
req.session.save(() =>
res.status(500).json({ message: e.message })
);
break;
}
}
}
});
Полная версия примера находится в разделе 03_complete_app проекта SIMC Quickstart
Оригинальная страница SIWC на форуме Conflux
Оригинальная идея: https://github.com/MPoulhazan , @KCharlemagne
Куратор проекта: https://github.com/Thegaram/Thegaram, @thegaram
Автор перевода: https://t.me/confluxcm, @Mitrandir, русскоязычное сообщество Сonflux
Отдельная благодарность автору оригинальной идеи, куратору проекта, а также амбассадору проекта Conflux @Nico
Полезные ссылки
SIWC | SIWC QuickStart | SIWC на NPM |
Присоединяйтесь к русскоязычному сообществу проекта Conflux Network:
Telegram | Официальный сайт |
Новостной канал в Telegram