2021年1月17日日曜日

MATTRの分散型IDプラットフォームを触ってみる - その2

こんにちは、富士榮です。

前回に引き続きMATTRの分散型IDプラットフォームを触ってみます。

前回はプラットフォーム自体のセットアップとIssuer DID、VC(Verifiable Credential)の設定までを行いましたので、今回はWalletに対して実際にVCを発行するところまでをやってみます。

MATTRの基本的な考え方としては、バックエンドのプラットフォーム自体は認証やユーザ管理の機能を持たず外部のIdentity Providerと連携したIssuerを通じてVCを発行する、という形となっています。

公式ドキュメントではAuth0と連携したIssuerを作成し、VCを発行する仕組みが紹介されていますので、まずはこれをやってみたいと思います。

やるべきことは以下の3つです。

  • 外部OpenID Providerの構成
  • 外部OpenID Providerと連携したIssuerの定義を作成
  • 出来上がったIssuerでの発行リクエストをQRコードにしてWalletで読み取りVCを発行

順番にやっていきましょう。

外部OpenID Providerの構成

先に触れた通り、Auth0を使って構成します。
(ちなみに、Azure AD B2Cで構成しようとするとwell-knownまでのパスが深すぎてMATTR側でInternal Server Errorが出ます。リバプロなどでAzure AD B2Cをカスタムドメイン化して動かしてあげる必要があります。これは別のポストで今後紹介していこうと思います)

Auth0は普段使っているテナントがそのまま使えるので特に問題はありません。
やるべきことは、
  • アプリケーション(Client)を作成する
  • ユーザに発行すべきcredentialの型と値を属性として持たせる

の2点だけです。

まずはアプリケーション登録ですが、通常のRegular Web Applicationとしてクライアント定義をしていきます。


MATTR側に設定するために必要なのはclient_idとclient_secretのみなのでアプリケーションを作成したこれらの値をメモしておきましょう。

ちなみにredirect_uriについてはMATTR側でIssuer定義を行うと生成されますのでここでは設定しなくてもOKです。


次にユーザに必要な属性を設定します。これもAuth0側の設定となりますが、該当のユーザを開き、user_metadataとして属性と値を設定します。サンプルに従いこんな感じに設定します。

{
  "educationalCredentialAwarded": "Almuni 2020"
}


一旦はOpenID Provider側の設定はおしまいです。

Issuerの作成

次はMATTRのAPIを使って先のOpenID Providerと連携したIssuerの定義を行います。
やるべきことは、以下のデータを設定したJSONをエンドポイントにPOSTするだけです。
  • 前回のPOSTで生成したIssuer DID
  • 先に取得したclient_id、client_secret、OPのurl(内部的に.well-knownを取得しにいくのでドメイン名の部分まで)
  • 属性のマッピング
この辺りはMicrosoftの仕組みとほぼ同じですね。Rulesの定義の仕方もDIF(Decentralized Identity Foundation)で仕様化をしようとしているので、今後は統一されてくるのかもしれませんが。

以下がサンプルに書いてあるIssuer作成のリクエストです。

curl --request POST \
  --url https://tenant.platform.mattr.global/oidc/v1/issuers \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer REPLACE_ACCESS_TOKEN' \
  --data '{"credential": {
             "issuerDid": "did:key:z6MkjBWPPa1njEKygyr3LR3pRKkqv714vyTkfnUdP6ToFSH5",
               "name": "University Attendance Credential",
               "context": [
                 "https://schema.org"
               ],
               "type": [
                 "AlumniCredential"
               ]
           },
           "federatedProvider": {
               "url": "https://example-university.au.auth0.com",
               "scope": [
                 "openid",
                 "profile",
                 "email"
               ],
               "clientId": "vJ0SCKchr4XjC0xHNE8DkH6Pmlg2lkCN",
               "clientSecret": "QNwfa4Yi4Im9zy1u_15n7SzWKt-9G5cdH0r1bONRpUPfN-UIRaaXv_90z8V6-OjH"
           },
           "claimMappings": [
               {
                 "jsonLdTerm": "alumniOf",
                 "oidcClaim": "alumni_of"
               }
           ]
          }'

結果、CallbackUrlを含むIssuerの設定情報が返ってくるので、この値をAuth0側のアプリケーション設定に追加します。

小さくてわかりにくいですが、Response Bodyの中にCallbackUrlが見えます。


WalletへVCを発行する

ここまででVC発行の準備は整いましたので、Walletアプリを使ってVC発行要求を読み込んでみます。

発行要求はこんなURLになるので、適当にQRコードにしてMATTRモバイルアプリで読み込ませます。
openid://discovery?issuer=https://tenant.platform.mattr.global/oidc/v1/issuers/983c0a86-204f-4431-9371-f5a22e506599
※この最後のIDは先に生成したIssuerのIDです。


QRコードを読み取ると左端の画像のようにCredential Offerとして表示され、ProceedをタップするとAuth0のログオンが要求され、成功するとCredentialを受け取流ことができます。



発行されたVCはこんな感じで中身の確認ができます。


全体に結構簡単でした。

今後はMicrosoftのVC基盤との連携や連携するID基盤としてAzure AD B2Cを使う、などのカスタマイズを入れていこうと思いますので、ネタが溜まってきたらまたご紹介させていただこうと思います。


0 件のコメント: