본문으로 건너뛰기

Sign In With QoreChain: 서버 검증

SIWQ는 EIP-4361 스타일의 로그인 메시지이며, 계정의 secp256k1 키(ADR-36)와 ML-DSA-87 키로 서명합니다. 형식: Sign In With QoreChain v1.

흐름​

  1. 서버가 세션용 일회용 nonce를 발급합니다.
  2. 클라이언트가 createSiwqMessage로 메시지를 만들고 지갑이 signSiwq로 서명합니다 (또는 signArbitrary로 고전 부분을, siwqPqSignBytes(message)에 대한 pqSign으로 ML-DSA-87 부분을 만듭니다).
  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는 requirePq: false를 전달하지 않는 한 ML-DSA-87 부분이 없는 로그인을 거부합니다. 서비스에 포스트 양자 보장이 필요하지 않은 경우에만 고전 전용 로그인을 허용하세요.

실행 가능한 서버는 examples/siwq-server에 있습니다.