إنتقل إلى المحتوى الرئيسي

Sign In With QoreChain: التحقق على الخادم

SIWQ هي رسالة تسجيل دخول على نمط EIP-4361 يوقّعها مفتاح secp256k1 للحساب (ADR-36) ومفتاح ML-DSA-87 الخاص به. الصيغة: Sign In With QoreChain v1.

التدفق​

  1. يصدر الخادم nonce لمرة واحدة للجلسة.
  2. يبني العميل الرسالة بالدالة createSiwqMessage وتوقّعها المحفظة بالدالة signSiwq (أو تنتج الجزء الكلاسيكي بـ signArbitrary وجزء ML-DSA-87 بـ pqSign على siwqPqSignBytes(message)).
  3. يتحقق الخادم بالدالة verifySiwqWithChain، التي تفحص الرسالة والـ nonce والنطاق والأوقات، وأن المفتاح الكلاسيكي يتحكم بالعنوان، وتتحقق من توقيع ML-DSA-87 مقابل المفتاح المسجَّل على السلسلة لذلك العنوان (راجع التحقق).

TypeScript​

import { verifySiwqWithChain } from "@qorechain/qoresign/network";

const fields = await verifySiwqWithChain({
rest: "https://api.qore.host",
address: body.address,
message: body.message,
signature: body.signature,
domain: "app.example.com", // the host the request came to
nonce: session.nonce, // single use; delete it now
chainId: "qorechain-vladi",
});
// fields.address is signed in; fields.possessionProven tells whether the key was registered with a proof of possession

Go​

import (
qoresign "github.com/qorechain/qoresign/go"
"github.com/qorechain/qoresign/go/network"
)

// The network helpers are methods on a client.
client := network.NewClient("https://api.qore.host")

var sig qoresign.SiwqSignature
if err := json.Unmarshal(signatureJSON, &sig); err != nil {
return err
}
result, err := client.VerifySiwqWithChain(ctx, address, qoresign.VerifySiwqOptions{
Message: message,
Signature: sig,
Domain: "app.example.com", // the host the request came to
Nonce: issuedNonce, // the nonce your server issued
ChainID: "qorechain-vladi",
})
if qoresign.IsCode(err, qoresign.CodeSiwqExpired) {
// ask the user to sign in again
}
// result.Address signed in; result.PossessionProven reports how the key was registered.

الحسابات الكلاسيكية فقط​

ترفض verifySiwq أي تسجيل دخول بلا جزء ML-DSA-87 ما لم يُمرَّر requirePq: false. لا تقبل تسجيلات الدخول الكلاسيكية فقط إلا إذا كانت خدمتك لا تحتاج إلى الضمان ما بعد الكمّي.

يوجد خادم قابل للتشغيل في examples/siwq-server.