Подписване на съобщения
Вашето приложение може да помоли потребител да подпише текстово съобщение със своя posting или active ключ. Подписът доказва, че потребителят контролира акаунта. Нищо не се излъчва: съобщението никога не стига до блокчейна. Hivesigner подписва по същия начин като requestSignBuffer на Hive Keychain, затова сървърният код, който проверява подпис от Keychain, проверява и подпис от Hivesigner.
Поискайте подпис
Изпратете потребителя към https://hivesigner.com/sign-buffer с тези query параметри:
| Параметър | Задължителен | Значение |
|---|---|---|
message |
Да | Точният текст за подписване. Трябва да съдържа нещо повече от интервали. |
redirect_uri |
Да | Къде Hivesigner изпраща резултата. Вижте Правила за адреса. |
authority |
Не | posting или active, с произволни главни и малки букви (Posting също върши работа). posting, когато липсва или е празен. Всяка друга стойност се отказва. |
client_id |
Не | Акаунтът на вашето приложение. Чете се и clientId. С него redirect_uri трябва да е един от адресите за обратно извикване на приложението ви. |
state |
Не | Всякаква стойност. Hivesigner я връща непроменена. |
account |
Не | Акаунтът, който очаквате да подпише. Hivesigner го избира, когато е на устройството, и го пренебрегва иначе. Чете се и select_account. |
Съставете адреса с URLSearchParams, за да е кодирана всяка стойност:
const params = new URLSearchParams({
message: 'MESSAGE',
authority: 'posting',
redirect_uri: 'REDIRECT_URI',
client_id: 'CLIENT_ID',
state: 'STATE',
});
window.location.assign(`https://hivesigner.com/sign-buffer?${params}`);
Правила за адреса
- Адресът за обратно извикване трябва да е
https://. Обикновенhttp://работи само на локален адрес:localhost,127.0.0.1или[::1]. - С
client_idадресът трябва да е регистриран на този акаунт на приложение, със същата проверка като при вход. Вижте Адреси за обратно извикване. Hivesigner чете адресите на приложението от Hive, когато заявката се отвори, и не подписва нищо, докато не ги прочете. Когато Hive е недостъпен, потребителят получава бутон Опитай отново. - Без
client_idвърши работа всеки адрес, който следва първото правило. Тогава Hivesigner назовава хоста на адреса като заявител, например "HOST ви моли да подпишете съобщение.".
Изпращайте client_id, когато имате акаунт за приложение. Тогава потребителят вижда името и акаунта на вашето приложение. Само вашите регистрирани адреси могат да получат подписа.
Hivesigner отказва заявка без съобщение, с непознат authority, с липсващ или неизползваем адрес, с client_id, който не е Hive акаунт, или с адрес, нерегистриран на това приложение. Потребителят вижда "Тази заявка за подпис не може да се използва: нужни са съобщение, posting или active ключ и защитен URL адрес за пренасочване, регистриран за приложението. Върнете се в сайта и опитайте отново." и бутон Докладвайте този проблем.
Какво вижда потребителят
- Заглавие, което назовава вашето приложение (или хоста на адреса) и "Ще ви пренасочи към HOST".
- Цялото съобщение, точно както ще бъде подписано. Символите, които биха могли да скрият текст или да променят посоката му, се показват като кодове, например
\u{200B}. - "Подписва се с вашия posting ключ" или "Подписва се с вашия active ключ".
- Предупреждение: "Подписът ви доказва на всеки, който го види, че @USERNAME е подписал точно този текст. Подписвайте само съобщение, което разбирате."
- Подпиши и Отказ. Заключеният акаунт първо иска своя код за достъп.
Заявки за подписване на съобщение описва екрана за потребителите.
Какво получава вашият адрес
Когато потребителят избере Подпиши, Hivesigner го изпраща към вашия адрес с тези query параметри:
| Параметър | Стойност |
|---|---|
signature |
Подписът, като шестнадесетичен низ от 130 символа |
public_key |
Публичният ключ на ключа, който е подписал, например STM... |
username |
Акаунтът, който е подписал |
authority |
posting или active |
state |
Вашият state, когато заявката е имала такъв (включително празен) |
Hivesigner ги добавя към query на вашия адрес, след ? или & и преди всеки #fragment. Вашият собствен query остава непроменен.
https://YOUR_APP/signed?signature=SIGNATURE&public_key=PUBLIC_KEY&username=USERNAME&authority=posting&state=STATE
Когато потребителят избере Отказ, Hivesigner отваря списъка му с акаунти. Вашият адрес не получава нищо.
Внимание: Всеки може да отвори вашия адрес с измислени стойности. Приемайте всеки параметър за твърдение, докато сървърът ви не провери подписа.
Проверете подписа
Проверете подписа на своя сървър:
- Пазете на сървъра си съобщението, което сте поискали, заедно с неговия
state. Не се доверявайте на копие, което се връща от браузъра. - Хеширайте съобщението: sha256 върху неговите UTF-8 байтове.
- Възстановете публичния ключ от подписа и този хеш.
- Заредете акаунта от Hive. Проверете, че възстановеният ключ принадлежи на правомощията, които сте поискали, с достатъчна тежест да подписва сам.
- Проверете, че
stateе този, който сте издали. Приемайте всяко съобщение веднъж.
Този пример използва dhive (https://www.npmjs.com/package/@hiveio/dhive):
import { Client, Signature, cryptoUtils } from '@hiveio/dhive';
const hive = new Client(['https://api.hive.blog']);
// message and authority: what you asked for, from your own records.
// signature and username: from the callback.
export async function verifySignBuffer({ message, authority, signature, username }) {
let recovered;
try {
const hash = cryptoUtils.sha256(message); // sha256 over the UTF-8 bytes
recovered = Signature.fromString(signature).recover(hash).toString();
} catch {
return false; // not a valid signature
}
const [account] = await hive.database.getAccounts([username]);
if (!account) return false;
const auth = account[authority]; // 'posting' or 'active'
return auth.key_auths.some(
([key, weight]) => key === recovered && weight >= auth.weight_threshold,
);
}
Същата проверка работи за подпис от requestSignBuffer на Hive Keychain. Сравнявайте с ключа, който сте възстановили: public_key в адреса е само подсказка.
Съобщения, които Hivesigner не подписва
Съобщение, което е JSON обект с ключ signed_message, има вида на токен на Hivesigner. Подписването му би дало на заявителя достъп до акаунта на потребителя. Hivesigner никога не подписва такова съобщение. Той казва на потребителя "Това съобщение е токен на Hivesigner. Подписването му би дало на сайта достъп до вашия акаунт, затова не може да бъде подписано."
Използвайте обикновен текст или JSON без ключ signed_message. Кажете за какво е подписът и добавете стойност, която генерирате веднъж, например:
Confirm your account for YOUR_APP
Account: USERNAME
Nonce: NONCE
Инструментът Подписване на съобщение
Хората могат и сами да подпишат съобщение на https://hivesigner.com/signmessage (Подписване на съобщение) и да проверят такова на https://hivesigner.com/verifymessage (Проверка на съобщение). Вижте Подпишете съобщение сами.
Този инструмент подписва по различен начин от /sign-buffer. Той подписва тяло на токен на Hivesigner, което съдържа съобщението, акаунта и времето. Споделя резултата като Токен за проверка. Проверявайте такъв токен на страницата Проверка на съобщение или както е описано в Проверете го сами, а не с кода по-горе.