認証

開発者として認証を受ける

JWTの取得

DIMO で認証を行う前に、以下に説明する 3 種類の JWT があります。

JWTタイプ
これは何ですか?
有効期限
どうやって入手するのですか?

使用者JWT

使用者JWTには、audienceログインしているユーザーのアカウント情報と開発者ライセンスがethereum_addressフィールド内に格納されています。このJWTは、ユーザーがDIMOで認証されていることを検証します。

14 日後、ユーザーは再度認証を行う必要があります。

フロントエンドで DIMO を使用したログインを活用します。

開発者JWT

開発者 JWT には、開発者ライセンスが とaudienceの両方として含まれていますethereum_address。この JWT は、あなたが DIMO に登録されたアプリであることを証明します。

デフォルトは14日間です。開発者はプログラムで再認証する必要があります。14日間をハードコードするよりも、JWTをデコードして更新された有効期限のタイムスタンプを取得することを強くお勧めします。

バックエンドで開発者ライセンスを活用します。

車両JWT

車両の個人データにアクセスするための、開発者向けのセカンダリJWTです。このJWTは、車両( で識別token_id)と、ユーザーが開発者に付与した権限の配列に固有のものです。このJWTは、アプリが車両データを取得する権限を持っていることを検証します。以前は と呼ばれていましたprivilege_token

10 分後、開発者はプログラムによって別の交換をトリガーします。

トークン交換 APIで開発者 JWT を使用します。

認証フォーマット

DIMO はベアラー認証形式を使用します。

仕組み

DIMO の認証は次の 3 つのステップで行われます。

  1. チャレンジの生成:特定のアドレスのチャレンジと状態を生成します。

  2. 署名チャレンジ: APIへの JSON Web Tokenを取得するためにサインインするには、署名者は暗号メッセージに署名し、関連付けられた公開鍵の所有者であることを証明します。このプロセスは、デジタル署名によるサインインと呼ばれます。

  3. チャレンジの送信:公開キーを使用して、ユーザーのデジタル署名を検証し、設定された権限でリソースへのアクセスを許可または拒否します。

DIMO によるバックエンド アプリケーション用の Web3 署名メカニズムの実装は、以下の 3 つの手順で完了します。

ステップ1:課題を生み出す

POST https://auth.dimo.zone/auth/web3/generate_challenge

クエリパラメータ

Name
Type
Description

client_id*

String

Configured client identifier, this is the 0x client identifier received when you issue a Developer License.

domain*

String

A valid redirect URI for the client, this is the domain that you set when you configure a Developer License.

scope*

String

Space-separated list of scopes, this needs to be openid email

response_type*

String

This needs to be code.

address*

String

A hex-encoded, 0x-prefixed, 20-byte Ethereum address (case insensitive). This is the contract address of your Developer License as you are assuming the role of signer of the license. The value is essentially the same as the client_id.

{
  "state":"jot5csziknrzscg2wcbtgaofu",
  "challenge":"auth.dimo.zone wants you to sign in with your Ethereum account:\n<YOUR_ADDRESS>\n\n<host> is asking you sign in.\n\nURI: https://auth.dimo.zone\nVersion: 1\nChain ID: 1\nNonce: 4P8AfZTqj9QwDM8tKc2vfIqQogxpXK\nIssued At: 2024-01-08T15:31:15Z"
}

ステップ2:サインチャレンジ

challenge手順 1 の文字列を 16 進数にフォーマットし、先頭に 0x を付けて、開発者コンソールから取得した文字列と組み合わせてから、Ethereum トランザクションに署名し、65 バイトの署名を取得する必要がありapiKeyます。

に署名するにはchallenge、お好みのプログラミング言語のライブラリを使用して、ローカル秘密鍵でEthereumのトランザクションとメッセージに署名する必要があります。初心者向けに、いくつかの言語例を以下に示します。


const web3 = require('web3');

const msg = "<challenge>"
const apiKey = "<api_key>"
const formattedKey = '0x' + Buffer.from(apiKey, 'utf8');

console.log(web3.eth.accounts.sign(msg, formattedKey));
{
  message: 'auth.dimo.zone wants you to sign in with your Ethereum account:\n' +
    '0xf9D26323Ab49179A6d57C26515B01De018553666\n' +
    '\n' +
    'app.dimo.zone is asking you sign in.\n' +
    '\n' +
    'URI: https://auth.dimo.zone\n' +
    'Version: 1\n' +
    'Chain ID: 1\n' +
    'Nonce: EXVgxuxMiNfdWzwIcQU4XZ79zzwX6L\n' +
    'Issued At: 2024-01-22T15:34:47Z',
  messageHash: '0x293013bcae66e507384b791b35bd3701284b613887fc11d3a6debcde394c66db',
  v: '0x1c',
  r: '0xccd996ee0f2d18944034f29e5a9565158202d8d66194adcbe0c13eba96feb18e',
  s: '0x1783254ec656186cd1461693969c10aff0014f4690ee2f83781dbf8c4c657ef3',
  signature: '0xcbd996ee0f2d18944034f29e5a9565158202d8d66194adcbe0c13eba96feb18e1783254ec656186cd1461693969c10aff0014f4690ee2f83781dbf8c4a657ef31c'
}

ステップ3: チャレンジを提出する

POST https://auth.dimo.zone/auth/web3/submit_challenge

x-www-form-urlencodedボディパラメータに使用します。

リクエスト本文

Name
Type
Description

client_id*

String

Configured client identifier, this is the 0x client identifier received when you issue a Developer License.

state*

String

The state string returned from Step 1.

grant_type*

String

This needs to be authorization_code.

domain*

String

A valid redirect URI for the client, this is the domain that you set when you configure a Developer License.

signature*

String

The 0x-prefixed signature obtained from Step 2.

{
    "access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6Ijc4ZjVkNDk3ZjVjZDM3MzljYjNhYmZhZDExZjRhZWQ2ZWQxNmNhMWYifQ.eyJpc3MiOiJodHRwczovL2F1dGguZGV2LmRpbW8uem9uZSIsInByb3ZpZGVyX2lkIjoid2ViMyIsInN1YiI6IkNpb3dlR1k1UkRJMk16SXpRV0kwT1RFM09VRTJaRFUzUXpJMk5URTFRakF4UkdVd01UZzFOVE0zT0RjU0JIZGxZak0iLCJhdWQiOiJ2ZWhpY2xlLWdlbml1cyIsImV4cCI6MTcwNTkzNTg5MCwiaWF0IjoxNzA0NzI2MjkwLCJhdF9oYXNoIjoiQnBVZXJtcmJMMUlNVkxNdXpELW93USIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwiZXRoZXJldW1fYWRkcmVzcyI6IjB4ZjlEMjYzMjNBYjQ5MTc5QTZkNTddMjY1MTVCMDFEZTAxODU1Mzc4NyJ9.BrZeLozHwFxQoyTnpe9TVjoFFyqh3xs2xi6KQrguQGyyWoqFr03SjDCbY_Les6IUI9JD_xWf9bu04w82LD0NqsnO7nqrYwrVwriYUmh1cZskZPUDrL5_kMaN0FxQa-ea9g4ruVEXLU_aM206q2Wp7qqyjd5AhuPAgqAL6mDGviGXr2lJYfxrs0eclO9-w4Z4XO0hRkLO_ODhCDrBeKcwPHEmhTNH6Vw0ReI_05FwIFzz_biIpS6rj45F0nSLrMcJx-2UD9upaMDzLwA_9QPoXzoA3hfdPNKGPU0KEgMJF9thFa2K0daqXqAMXUkxwOSSYWdn58Z8NJGFWN6bzyJqC3",
    "token_type": "bearer",
    "expires_in": 1209599,
    "id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6Ijc4ZjVkNDk3ZjVjZDM3MzljYjNhYmZhZDExZjRhZWQ2ZWQxNmNhMWYifQ.eyJpc3MiOiJodHRwczovL2F1dGguZGV2LmRpbW8uem9usSIsInByb3ZpZGVyX2lkIjoid2ViMyIsInN1YiI6IkNpb3dlR1k1UkRJMk16SXpRV0kwT1RFM09VRTJaRFUzUXpJMk5URTFRakF4UkdVd01UZzFOVE0zT0RjU0JIZGxZak0iLCJhdWQiOiJ2ZWhpY2xlLWdlbml1cyIsImV4cCI6MTcwNTkzNTg5MCwiaWF0IjoxdzA0NzI2MjkwLCJhdF9oYXNoIjoibGdyZGx5UXhWVWlMY0o1ZWxmTU1odyIsImNfaGFzaCI6IkZid2NTVUlJcnl0S2xVblZHWjE4Z3ciLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImV0aGVyZXVtX2FkZHJlc3MiOiIweGY5RDI2MzIzQWI0OTE3OUE2ZDU3QzI2ETE1QjAxRGUwMTg1NTM3ODcifQ.afO4QhbCfzWZpB_VQhTuJBONA8hYMc8Dw97kNdDBwbYWCIZ_PFzIRUPJe75k19Y0oKm8hNeadyzV36x4uvv4wagfjEPXcttqzoiRrnFjwX5tHZgNaRSznBf6W6PoNzkx7GyGWmeW_AtV3Y4g_fDhC2PKVZeWlw346Prchf_mLDuC5d6HSydu4LoSGHRVhMXlbbwoXGcc3Jui-wMxli8gYx1N__5DXiGvasZgmZefRq9DqPhd5Nlp0AV7bDSSLVJOUZJybbHT153les-_IzMlyqowxrAaJl9ENk5ME5ak4g_gHUpJzPQAf3oe61K-sYKNUYcguah73xfysmbWc_bFsg"
}

Last updated

Was this helpful?