Previous << Introduction
Next >> User Signature
UX/DXを改善し、アプリケーションのバックエンドとサービスとのシームレスな統合を促進するために、fcl.authenticate
がアップグレードされました。
追加のデータは、FCL:VIEW:READY:RESPONSE
のbodyの中に送られます。このデータには、ウォレットがユーザーのプライベートキーで署名するための、メッセージを構築するために必要なデータが含まれています。署名はオプショナルのaccount-proof
サービスの一部として、FCL:VIEW:RESPONSE
により返されます。
ウォレットから提供された場合、この署名および追加のアカウント証明(account-proof)データは、fcl.currentUser
サービスを介してアプリで利用可能になります。このサービスのデータは、メッセージを再作成し、Flow Blockchain上で署名を検証するために使用できます。
例えば、このデータをアプリのバックエンドに送信し、署名およびその他のアカウント証明データを検証した後、包有されたアカウントアドレスを安全にユーザーに関連付け、それらをログインさせることができます。
TL;DR Wallet Provider
- Walletは、Authn
FCL:VIEW:READY:RESPONSE
リクエストを受信し、appIdentifier
とnonce
を解析します。 - Walletは、ユーザーをユーザーの選んだ方法で認証し、ユーザーのアカウント
address
を決定します。 - Walletはメッセージを準備し、署名します。
-
appIdentifier
とnonce
、address
を"FCL-ACCOUNT-PROOF-V0.0"
というドメイン分離タグと一緒に、下記で説明するエンコードスキームを使用してエンコードします。 - ユーザーのキー上で指定された
signatureAlgorithm
およびhashAlgorithm
を使用してメッセージに署名します。署名を行う前に、ウォレットがメッセージデータを表示し、ユーザーの承認を受けることを強くお勧めします。
-
- Authnの完了時に、ウォレットはこの新しいサービスとデータを他のサービス設定とともに送り返します。
Account Proof Message Encoding
アカウント証明メッセージ(account proof message)は以下のようにエンコードされています。
MESSAGE =
USER_DOMAIN_TAG ||
RLP_ENCODE([
APP_IDENTIFIER,
ADDRESS,
NONCE
])
以下の値を持つ:
-
ACCOUNT_PROOF_DOMAIN_TAG
は定数"FCL-ACCOUNT-PROOF-V0.0"
であり、UTF-8 バイト配列としてエンコードされ、32バイトの長さになるようゼロバイトで右詰されています。 -
APP_IDENTIFIER
は任意の長さの文字列です。 -
ADDRESS
は、アドレスバイトを含むバイト配列で、8バイトの長さになるようゼロバイトで左詰めされます。 -
NONCE
は、最小32バイトの長さのバイト配列です。
RLP_ENCODE
は、RLP エンコーディングを実行する関数で、エンコードされた値をバイト型で返します。
JavaScript Signing Example
/* Using WalletUtils */
import {WalletUtils} from "@onflow/fcl"
const message = WalletUtils.encodeAccountProof(
appIdentifier, /* A human readable string to identify your application during signing */
address, /* Flow address of the user authenticating */
nonce, /* minimum 32-btye nonce */
)
sign(privateKey, message)
/* Without using FCL WalletUtils */
const ACCOUNT_PROOF_DOMAIN_TAG = rightPaddedHexBuffer(
Buffer.from("FCL-ACCOUNT-PROOF-V0.0").toString("hex"),
32
)
const message = rlp([appIdentifier, address, nonce])
const prependUserDomainTag = (message) => ACCOUNT_PROOF_DOMAIN_TAG + message
sign(privateKey, prependUserDomainTag(message))
/* Authentication Proof Service */
{
f_type: "Service", /* Its a service! */
f_vsn: "1.0.0", /* Follows the v1.0.0 spec for the service */
type: "account-proof", /* the type of service it is */
method: "DATA", /* Its data! */
uid: "awesome-wallet#account-proof", /* A unique identifier for the service */
data: {
f_type: "account-proof",
f_vsn: "1.0.0"
/* The user's address (8 bytes, i.e 16 hex characters) */
address: "0xf8d6e0586b0a20c7",
/* Nonce signed by the current account-proof (minimum 32 bytes in total, i.e 64 hex characters) */
nonce: "75f8587e5bd5f9dcc9909d0dae1f0ac5814458b2ae129620502cb936fde7120a",
signatures: [CompositeSignature],
}
}
Last updated on Nov 26, 2024 by Vishal
翻訳元
Flow BlockchainのCadence version1.0ドキュメント (Provable Authn)