Provable Authn

[Previous << Introduction](https://qiita.com/flowcadence/items/322bc393bdb2d328ea0d)
[Next >> User Signature](https://qiita.com/flowcadence/items/af846638da5bc2bb4bdc)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#reference-2020832ebee1810a325a

UX/DXを改善し、アプリケーションのバックエンドとサービスとのシームレスな統合を促進するために、`fcl.authenticate`がアップグレードされました。

追加のデータは、`FCL:VIEW:READY:RESPONSE`のbodyの中に送られます。このデータには、ウォレットがユーザーのプライベートキーで署名するための、メッセージを構築するために必要なデータが含まれています。署名はオプショナルの`account-proof`サービスの一部として、`FCL:VIEW:RESPONSE`により返されます。

ウォレットから提供された場合、この**署名**および追加の**アカウント証明(account-proof)データ**は、`fcl.currentUser`サービスを介してアプリで利用可能になります。このサービスのデータは、メッセージを再作成し、Flow Blockchain上で署名を検証するために使用できます。

例えば、このデータをアプリのバックエンドに送信し、署名およびその他のアカウント証明データを検証した後、包有されたアカウントアドレスを安全にユーザーに関連付け、それらをログインさせることができます。

<h1>TL;DR Wallet Provider</h1>

1. Walletは、Authn `FCL:VIEW:READY:RESPONSE`リクエストを受信し、`appIdentifier`と`nonce`を解析します。
1. Walletは、ユーザーをユーザーの選んだ方法で認証し、ユーザーのアカウント`address`を決定します。
1. Walletはメッセージを準備し、署名します。
   - `appIdentifier`と`nonce`、`address`を`"FCL-ACCOUNT-PROOF-V0.0"`というドメイン分離タグと一緒に、[下記で説明するエンコードスキームを使用して](#account-proof-message-encoding)エンコードします。
   - ユーザーのキー上で指定された`signatureAlgorithm`および`hashAlgorithm`を使用してメッセージに署名します。**署名を行う前に、ウォレットがメッセージデータを表示し、ユーザーの承認を受けることを強くお勧めします。**
1. Authnの完了時に、ウォレットはこの新しいサービスとデータを他のサービス設定とともに送り返します。

<h3>Account Proof Message Encoding</h3>

アカウント証明メッセージ(account proof message)は以下のようにエンコードされています。
```ruby
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 エンコーディングを実行する関数で、エンコードされた値をバイト型で返します。
<h3>JavaScript Signing Example</h3>

```ruby
/* 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))
```
```ruby
/* 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***

翻訳元

https://developers.flow.com/tools/wallet-provider-spec/provable-authn

***
<b>[Previous << Introduction](https://qiita.com/flowcadence/items/322bc393bdb2d328ea0d)
</b>

[Flow blockchain / Cadence version1.0ドキュメント](https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a) (Provable Authn)

<b>[Next >> User Signature](https://qiita.com/flowcadence/items/af846638da5bc2bb4bdc)</b>