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を使う、などのカスタマイズを入れていこうと思いますので、ネタが溜まってきたらまたご紹介させていただこうと思います。


2021年1月16日土曜日

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

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

ここ数年、uPort〜Microsoft VC as a Serviceなど分散型ID(DIDs/VCs*)に絡んでいるわけですが、一昨年秋のIIWに参加したときにPoCの話を聞いたMATTRのプラットフォームがかなりいい感じに進化していたので触ってみました。

* DIDs: Decentralized Identifiers

* VCs: Verifiable Credentials


MATTRについて

会社自体についてはそこまで詳しく知りませんが、ニュージーランドの会社です。

この辺りこの辺りでは有名ですね。

現在、MATTRが提供しているのはプラットフォームと関連する開発ツール群のようです。

プロダクトページより)


MATTR Platformについて

プラットフォームはコア機能として、

  • DID
  • Messaging
  • Verifiable Credentials
  • Verifiable Presentations
に関する生成、取得、削除、検証に関する機能群を提供しています。

また、拡張機能として、
  • OIDC Bridge
  • White Label Mobile Wallet & SDKs(提供予定)
が、ロックイン回避のために以下の機能もあらかじめ提供しているようです。
  • 複数のDID Methodのサポート
  • Secure Storageのサポート
  • プラガブルなKey Managementのサポート
IIWではOIDC Bridgeの部分のデモを見せてもらいました。
当時、私はuPortとAzure AD B2CとLibJeIDを組み合わせて免許証をトラストアンカーにしたuPort Credentialを発行、B2BのWebサイトでの身元確認を行う、というようなデモを作ったりしていました。懐かしい。


開発ツールについて

プラットフォーム以外にも開発者向けに以下の機能が提供されています。
  • MATTR Mobile Wallet App
  • Sample Applications
  • MATTR Command Line Interface(提供予定)


今回、プラットフォームのコア部分に関するSandbox環境を払い出してもらったので少し触ってみます。

では、早速レビューを。

トライアル申し込みをする

まずは環境をもらうところからですが、先程のプロダクトページの一番下にSandbox環境のトライアル申し込みがあるので申し込んでみました。

しばらくするとメールとSlackへの招待がくるので、Slackで担当の方と会話をすることになります。基本的にはKeybase上でトライアルテナントの情報とかシークレットなどを渡すからまずはKeybaseのアカウントを教えるように言われるのでアカウント名を伝えます。
(Keybaseのアカウントを作るところから始めました)

アカウントを伝えると今度はKeybaseのチャットで担当の人から以下の情報をもらえます。
  • tenantSubdomain: xxxx.sandbox.platform.mattr.global
  • tenantId: xxx-xxx-xxx
  • url: https://mattr-prod.au.auth0.com/oauth/token(Auth0使ってるんですね)
  • audience: https://platform.mattr.global
  • client_id: xxxxxxxxxxx
  • client_secret: xxxxxxxxxxx

プラットフォームの設定を行う

先にもらった情報があるとプラットフォームにアクセスできるようになります。(といってもAPIだけしか存在しないので、APIを叩きまくるんですが)

詳細は
に手順がのっているのでこちらをみながら進めます。

API Auth Tokenを取得する

要するに、先程Keybaseで伝えられたclient_idやclient_secretはAuth0のプラットフォームでaccess_token(MATTRプラットフォームのAPI Auth Token)を取得するためのものだったわけです。
普通にclient_credentialsでaccess_tokenを取得します。

curl --request POST \
  --url https://mattr-prod.au.auth0.com/oauth/token \
  --header 'Content-Type: application/json' \
  --data '{"client_id": "xxxxxxxxxx",
           "client_secret": "xxxxxxxxxx",
           "audience": "https://platform.mattr.global",
           "grant_type": "client_credentials"
          }’

DIDを生成する

まずはDIDを生成してます。
methodとしてはkey、web、sovの3種類をサポートしているようです。
didのエンドポイントにAPI Auth Tokenをつけて生成リクエストをPOSTするだけなので非常にシンプルです。
curl --request POST \
  --url https://tenant.platform.mattr.global/v1/dids \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer REPLACE_ACCESS_TOKEN' \
  --data '{   "method":"key",
              "options": {
                  "keyType":"ed25519"
              }
          }'

うまくいくとDID Documentが返ってきます。
MATTRのResolver APIもありますが、Universal Resolverでもちゃんと解決できるようになります。

Issuerに関する情報を確認する

DIDを発行することでIssuerのDID構成情報を確認することができるようになります。DIFのWell Known DID Configurationのスペックに対応しているようです。

curl --request GET \
  --url https://tenant.platform.mattr.global/.well-known/did-configuration \
  --header 'Accept: application/json'

結果、IssuerのDID構成情報が確認できます。

VCを発行する

こちらもAPIが用意されていますので、IssuerのDID、SubjectのDID、VCに含めるClaimなどを決めてPOSTしてあげるだけです。
curl --request POST \
  --url https://tenant.platform.mattr.global/v1/credentials \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer REPLACE_ACCESS_TOKEN' \
  --data '{"@context":["https://www.w3.org/2018/credentials/examples/v1" , "https://www.w3.org/2018/credentials/v1"],
           "subjectId":"did:key:z6MkjBWPPa1njEKygyr3LR3pRKkqv714vyTkfnUdP6ToFSH5",
           "type":["AlumniCredential"],
           "claims":{"givenName":"Jamie",
                     "familyName":"Doe",
                     "alumniOf":"Example University"},
           "issuer":{"id":"did:key:z6Mkg7FkYxUpSKBEUJMeG91A9vz66GfWxB4m9Lq81AMZ7wNT",
                     "name":"Example University"},
           "persist":true,
           "revocable":true
          }'

ありがちな卒業生である証明を発行するサンプルですね。

発行したVCは同じAPIのエンドポイントにGETしてあげると一覧表示されます。

とりあえず最低限必要な機能はちゃんと動いていますし、他にもVCのRevokeなど管理系のAPIも充実している感じです。

Walletアプリも使えるようにしてもらったので、次回はOIDC Bridgeと合わせてWalletへのVP/VC発行とOIDC-DID Authのゲートウェイでのログインなどチュートリアルにそって試してみようかと思います。