0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Provable Authn

Last updated at Posted at 2024-12-12

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

  1. Walletは、Authn FCL:VIEW:READY:RESPONSEリクエストを受信し、appIdentifiernonceを解析します。
  2. Walletは、ユーザーをユーザーの選んだ方法で認証し、ユーザーのアカウントaddressを決定します。
  3. Walletはメッセージを準備し、署名します。
    • appIdentifiernonceaddress"FCL-ACCOUNT-PROOF-V0.0"というドメイン分離タグと一緒に、下記で説明するエンコードスキームを使用してエンコードします。
    • ユーザーのキー上で指定されたsignatureAlgorithmおよびhashAlgorithmを使用してメッセージに署名します。署名を行う前に、ウォレットがメッセージデータを表示し、ユーザーの承認を受けることを強くお勧めします。
  4. 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

翻訳元


Previous << Introduction

Flow BlockchainのCadence version1.0ドキュメント (Provable Authn)

Next >> User Signature

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?