বার্তা সাইন করা
আপনার অ্যাপ কোনো ব্যবহারকারীকে তার পোস্টিং বা অ্যাক্টিভ কী দিয়ে একটি লেখা বার্তা সাইন করতে বলতে পারে। স্বাক্ষরটি প্রমাণ করে যে ব্যবহারকারী অ্যাকাউন্টটি নিয়ন্ত্রণ করেন। কিছুই ব্রডকাস্ট হয় না: বার্তাটি কখনও ব্লকচেইনে পৌঁছায় না। Hivesigner ঠিক Hive Keychain-এর requestSignBuffer-এর মতোই সাইন করে, তাই যে সার্ভার কোড Keychain-এর স্বাক্ষর যাচাই করে সেটিই Hivesigner-এর স্বাক্ষরও যাচাই করে।
স্বাক্ষরের অনুরোধ করুন
ব্যবহারকারীকে এই কোয়েরি প্যারামিটারগুলোসহ https://hivesigner.com/sign-buffer-এ পাঠান:
| প্যারামিটার | আবশ্যক | অর্থ |
|---|---|---|
message |
হ্যাঁ | ঠিক যে লেখাটি সাইন হবে। এতে ফাঁকা জায়গার বেশি কিছু থাকতে হবে। |
redirect_uri |
হ্যাঁ | Hivesigner ফলাফল কোথায় পাঠাবে। দেখুন কলব্যাকের নিয়ম। |
authority |
না | posting বা active, ছোট-বড় যে কোনো অক্ষরে (Posting-ও চলে)। না থাকলে বা ফাঁকা থাকলে posting। অন্য যে কোনো মান প্রত্যাখ্যাত। |
client_id |
না | আপনার অ্যাপ অ্যাকাউন্ট। clientId-ও পড়া হয়। এটি থাকলে redirect_uri আপনার অ্যাপের কলব্যাকগুলোর একটি হতে হবে। |
state |
না | যে কোনো মান। Hivesigner সেটি অপরিবর্তিত ফেরত দেয়। |
account |
না | আপনি যে অ্যাকাউন্টের সাইন প্রত্যাশা করেন। সেটি ডিভাইসে থাকলে Hivesigner তা নির্বাচন করে, নয়তো উপেক্ষা করে। select_account-ও পড়া হয়। |
URL-টি 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 পাঠান। তখন ব্যবহারকারী আপনার অ্যাপের নাম আর অ্যাকাউন্ট দেখেন। শুধু আপনার নিবন্ধিত কলব্যাকগুলোই স্বাক্ষরটি পেতে পারে।
বার্তা নেই, authority অজানা, কলব্যাক অনুপস্থিত বা অব্যবহারযোগ্য, client_id Hive অ্যাকাউন্ট নয়, বা কলব্যাকটি ওই অ্যাপে নিবন্ধিত নয়, এমন অনুরোধ Hivesigner প্রত্যাখ্যান করে। ব্যবহারকারী দেখেন "এই সাইন অনুরোধটি ব্যবহার করা যাবে না: এর জন্য একটি বার্তা, একটি পোস্টিং বা অ্যাক্টিভ কী এবং অ্যাপের জন্য নিবন্ধিত একটি নিরাপদ রিডাইরেক্ট URL দরকার। সাইটে ফিরে গিয়ে আবার চেষ্টা করুন।" আর একটি এই সমস্যাটি রিপোর্ট করুন বোতাম।
ব্যবহারকারী যা দেখেন
- একটি শিরোনাম যাতে আপনার অ্যাপের নাম (বা কলব্যাকের হোস্ট) আর "আপনাকে HOST ঠিকানায় পাঠাবে" থাকে।
- পুরো বার্তাটি, ঠিক যেভাবে সাইন হবে। যেসব অক্ষর লেখা লুকাতে বা তার দিক বদলাতে পারে সেগুলো
\u{200B}-এর মতো কোড হিসেবে দেখানো হয়। - "আপনার পোস্টিং কী দিয়ে সাইন করা হবে" বা "আপনার অ্যাক্টিভ কী দিয়ে সাইন করা হবে"।
- একটি সতর্কবার্তা: "আপনার স্বাক্ষর যে কেউ দেখলেই প্রমাণ হয় যে @USERNAME ঠিক এই লেখাটিই সাইন করেছে। শুধু সেই বার্তাই সাইন করুন যা আপনি বোঝেন।"
- সাইন করুন আর বাতিল করুন। লক করা অ্যাকাউন্ট আগে তার পাসকোড চায়।
বার্তা সাইনের অনুরোধ পাতায় ব্যবহারকারীদের জন্য পর্দাটি বর্ণনা করা আছে।
আপনার কলব্যাক যা পায়
ব্যবহারকারী সাইন করুন বেছে নিলে Hivesigner তাকে এই কোয়েরি প্যারামিটারগুলোসহ আপনার কলব্যাকে পাঠায়:
| প্যারামিটার | মান |
|---|---|
signature |
স্বাক্ষর, ১৩০ অক্ষরের হেক্স স্ট্রিং হিসেবে |
public_key |
যে কী সাইন করেছে তার পাবলিক কী, যেমন STM... |
username |
যে অ্যাকাউন্ট সাইন করেছে |
authority |
posting বা active |
state |
আপনার state, অনুরোধে যখনই একটি ছিল (ফাঁকা হলেও) |
Hivesigner সেগুলো আপনার কলব্যাকের কোয়েরিতে যোগ করে, ? বা &-এর পরে আর যে কোনো #fragment-এর আগে। আপনার নিজের কোয়েরি যেমন আছে তেমনই থাকে।
https://YOUR_APP/signed?signature=SIGNATURE&public_key=PUBLIC_KEY&username=USERNAME&authority=posting&state=STATE
ব্যবহারকারী বাতিল করুন বেছে নিলে Hivesigner তার অ্যাকাউন্ট তালিকা খোলে। আপনার কলব্যাক কিছুই পায় না।
সতর্কতা: যে কেউ বানানো মান দিয়ে আপনার কলব্যাক খুলতে পারে। আপনার সার্ভার স্বাক্ষরটি যাচাই না করা পর্যন্ত প্রতিটি প্যারামিটারকে নিছক দাবি হিসেবেই ধরুন।
স্বাক্ষর যাচাই করুন
আপনার সার্ভারে স্বাক্ষরটি যাচাই করুন:
- আপনি যে বার্তাটি চেয়েছিলেন সেটি তার
stateসহ আপনার সার্ভারে রাখুন। ব্রাউজার থেকে ফেরত আসা কোনো অনুলিপিতে ভরসা করবেন না। - বার্তাটির হ্যাশ করুন: তার UTF-8 বাইটের উপর sha256।
- স্বাক্ষর আর ওই হ্যাশ থেকে পাবলিক কী উদ্ধার করুন।
- 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,
);
}
Hive Keychain-এর requestSignBuffer থেকে পাওয়া স্বাক্ষরের জন্যও একই যাচাই কাজ করে। আপনি যে কী উদ্ধার করেছেন তার সঙ্গেই মেলান: কলব্যাকের public_key শুধু একটি ইঙ্গিত।
যেসব বার্তা Hivesigner সাইন করে না
যে বার্তা একটি JSON অবজেক্ট আর তাতে signed_message কী আছে, সেটির আকার Hivesigner টোকেনের মতো। সেটি সাইন করলে অনুরোধকারী ব্যবহারকারীর অ্যাকাউন্টে প্রবেশাধিকার পেয়ে যাবে। Hivesigner কখনও এমন বার্তা সাইন করে না। সে ব্যবহারকারীকে বলে "এই বার্তাটি একটি Hivesigner টোকেন। এটি সাইন করলে সাইটটি আপনার অ্যাকাউন্টে প্রবেশাধিকার পেয়ে যাবে, তাই এটি সাইন করা যাবে না।"
সাধারণ লেখা ব্যবহার করুন, বা signed_message কী ছাড়া JSON। স্বাক্ষরটি কীসের জন্য তা বলুন আর একবার তৈরি করা একটি মান যোগ করুন, যেমন:
Confirm your account for YOUR_APP
Account: USERNAME
Nonce: NONCE
বার্তা সাইন করার টুল
মানুষ নিজেরাও https://hivesigner.com/signmessage ঠিকানায় (বার্তা সাইন করুন) একটি বার্তা সাইন করতে পারেন আর https://hivesigner.com/verifymessage ঠিকানায় (বার্তা যাচাই করুন) একটি যাচাই করতে পারেন। দেখুন নিজে একটি বার্তা সাইন করুন।
ওই টুল /sign-buffer থেকে আলাদাভাবে সাইন করে। সে একটি Hivesigner টোকেন বডি সাইন করে যাতে বার্তা, অ্যাকাউন্ট আর সময় থাকে। ফলাফলটি সে যাচাইকরণ টোকেন হিসেবে ভাগ করে নেয়। এমন টোকেন বার্তা যাচাই করুন পাতায় যাচাই করুন, বা নিজে যাচাই করুন পাতায় বর্ণিত উপায়ে, উপরের কোড দিয়ে নয়।