ラベル Auth0 の投稿を表示しています。 すべての投稿を表示
ラベル Auth0 の投稿を表示しています。 すべての投稿を表示

2024年11月13日水曜日

パスキーのテストサイトがリニューアル

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

以前も何度かWebAuthnのテストをするためのサイトを紹介しましたが、今回Okta(Auth0)がパスキー学習サイトをリニューアルしてきたので試してみます。



なんと日本語に対応しています。

ユーザIDやユーザ名など登録に使う情報はあらかじめ決まっていますが、デモとして試すこともできますし、API仕様などを含むリソースもまとまっています。

スクラッチで実装する人も、パスキーを基礎から学習したい人にもとても良いサイトなのでぜひアクセスしてみると良いと思います。


2024年10月21日月曜日

Auth0 Labの生成AI向けの認証・認可のサンプルを試す

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

イベント続きでほぼ毎日プレゼンしている気がしますが、ストレスが溜まるので現実逃避です。

Auth0が生成AI向けの認証・認可に関するサイトをオープンしました。


https://www.auth0.ai/

まぁ、もともとOpenAIの認証はAuth0だったこともあり、この分野は以前から取り組んできていたんだと思います。

生成AIの認証・認可といっても単純にチャットボットへのログインだけでは面白くないわけで、ユーザの代わりにAPIを読んだり、RAGの認証をしたり、ユーザの確認を非同期で行ったり、とやることはたくさんあります。

この辺りをAuth0 Labでパッケージングしたサンプルを公開している、ということですね。


Auth0 Labのアカウントで先ほどのサイトのデモを試すと、ChatGPTもどきのアプリケーションが動きます。



なお、このソースコードはこちらのgithubレポジトリで公開されているので、自分のローカル環境でも試すことができます。

https://github.com/auth0-lab/market0

こういうフロントエンドとAPI管理周りは生成AIのエンジンとは独立したレイヤですが、自前で作るのは面倒な領域なのでこういうものがあると便利ですね。


2024年7月27日土曜日

[Auth0/Okta CIC]ログインに使う識別子にメールアドレス・ユーザ名・電話番号を使う

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

たまにはAuth0/Okta CICを。
Auth0/Okta CICはログインする時の識別子はデフォルトでメールアドレスになっています。
これをユーザ名や電話番号を使うように設定することもできます、という話です。

ドキュメントはこちらにありますので、実際に設定する場合は注意点を含めこちらをみてください。


設定は簡単です。
ユーザ名とパスワードでの認証するコネクター「Username-Password-Authentication」の設定を開きます。

この中にAttributesというタブがあるので開きます。
するとNew Attributes ConfigurationがあるのでActivateします。(デフォルトはEmailのみってことですね)

確認されますので、Proceedを選択して進めます。


すると「Add Attribute」というボタンがアクティブ化されます。



クリックすると識別子として利用する属性を選択するポップアップが出ます。ユーザ名もしくは電話番号が選択できるようになります。

ユーザ名を選択すると関連する設定を行うことができます。
- ユーザ名を識別子として使うかどうか
- ユーザ名を使ってサインアップすることを許可するか(オプションか必須か)
- ユーザプロファイルとしてユーザ名を要求するか
- ユーザ名の文字列の長さ

また、詳細設定ではメールアドレス形式でユーザ名を許可するかの設定もできます。(現時点では電話番号形式のユーザ名は使えません。まぁ、正直どういうシナリオで使うのか不明ですが)


設定を終えるとログイン画面の入力ボックスに「ユーザー名またはメールアドレス」という形で表示が変わります。

また、サインアップ画面でもメールアドレスに加えてユーザー名も要求されるようになります。


なお、電話番号の方も似たような設定を行います。

設定が終わるとログイン画面が「電話、ユーザー名、またはメール」という表示に変わります。

サインアップ時に電話番号も入力が求められるようになります。


システムを移行する時など、複数の形式の識別子が混在するケースもありますので、そういうケースでは使えそうな機能ですね。
一方で通常はあんまり複数の形式のログインIDを有効にしておくとユーザも混乱しそうなので、割り切りも必要だと思います。

2024年6月27日木曜日

Auth0 Ambassadorプログラム

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

Auth0がOktaの一部となり一つの時代が終わったなぁ、とAuth0 Ambassadorの一人としても感慨に耽っていたここ3年くらいですが、諸々のプログラムが終わっていくのは寂しいものです。


ということでAuth0 Ambassadorプログラムはまだページは残っていますが終了していますね。

少し前のことですが、プログラム終了に伴い記念メダルをもらいました。



色々と面白いプログラムだったので少し寂しい思いはありますが、Auth0改めOkta CICはたまに触っていこうと思います。

ちなみに、Market Placeって仕組みもあり、某社がこんな感じでIdentity VerificationのActionを公開していますよ。


2024年3月17日日曜日

Auth0の管理画面へのログインにパスキーを使うと少しハマる件

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

そういえばAuth0(Okta CIC)の管理画面へのログインにパスキーなどが使えるので使ってみたいと思います。

ちなみにちょっとだけ癖があります。簡単に書くと、

  • パスキー追加をメニューから実施する場合はplatform認証器は選べない
  • USBキーやOTPなど多要素認証を追加し利用すると「このデバイスでのログインの高速化」を目的としてplatform認証器の登録を促される
  • リカバリはリカバリーコードを利用する
  • どうやらパスキーとしてはUSBなど外部キーを前提に設計されている
  • デバイス登録を目的にplatform認証器登録も使えるが同期される前提はなさそう

という感じです。最初からplatform認証器が登録できればいいのに。ちょっと実装が古いのかな。


さて、始める前に基本的な話を。IDaaSを使ってID基盤を構築するときに忘れてはいけないのはIDaaS自体の認証強化とアクセス制限です。

最低限やっておくべきことは、
  • 管理者アカウントの分離(共有ユーザの排除)
  • 管理権限の適正化
  • 認証強化(多要素認証)
  • ※API実行ユーザも忘れずに!
くらいでしょうか。
特にヘルプデスクやオペレータのアカウントも作る必要もあると思うので適切に権限分離は重要だと思います。
また、日本企業に多いと思いますが、上記に加えてアクセス元の環境の制限(IP制限など)も行いたい、という話も出てくることもあります。(これは働き方改革なのか、ネットワークペリメーター神話がまだまだ生きているだけなのかはケースバイケースです)

ということでAuth0でも管理画面へのログイン時の認証を強化できますのでやっておきましょう。
ちなみに、ご存知の通りAuth0の管理画面へログインするためにはローカルログインに加えてLinkedInやMicrosoft Account、Githubアカウント、Googleアカウントが使えます。
当然、それらのIDシステムもパスキーに対応していたりと認証強化を行うことは可能ですが、今回のテーマはAuth0側でさらに認証強化をする、という話です。

IdP側の認証強化の結果をこのケースおけるRPとなるAuth0の管理画面はどこまで信じることができるのか?と言う話とUI/UXの関係については別途書こうと思いますが、ざっくり言うと外部IdP(ここで言うとGoogleなど)は認証結果に対する責任は取ってくれない、かつどのような認証手段で認証したのかは教えてくれないので、重要な顧客IDを預かるIDaaSは自前でも多要素認証を実装しておくことが重要です。

ログインしてプロファイルページを開くと認証手段の追加ができます。
ちなみに設定が行われいていないテナントでは順次ログイン時に強制的に多要素認証設定を行うように促されるため最近のテナントを持っている方は設定済みかもしれません。

ということで追加してみます。WebAuthn with FIDO Security Keysをクリックしてみましょう。(なお、ポップアップがブロックされているとエラーになりますので、許可してください)

登録画面が出てきますね。初めに書いた通りplatform認証器ではなくUSBセキュリティキーが前提となっています。
登録が終わるとリカバリーコードが発行されるのでコピーしておきます。ちなみにダッシュボードからリカバリーコードは再生成できますので、こちらのスクリーンショットのコードはすでに無効です。

これで登録が完了しました。

一旦ログアウトしてログインし直してみます。USBキーが求められます。

すると、「このデバイスでのログインを高速化」と言われます。

そしてTouch IDが求められます。

USBキーとデバイスの両方が登録された状態になります。

USBキーを使う場面は少なくともSyncされたデバイスでは出番はなさそうです。
どうもplatform認証器はあくまでデバイス登録を目的としたものとして整理されているようですね。

しかし、iCloudで同期されているのかと思いつつiPhoneでダッシュボードにログインしてみるとplatform認証器は使えません。
USBキーが求められるので、仕方なく先ほど登録したUSBキーを使ってログインします。(先ほどYubikey NFCを使ったのでNFCで読み込ませました)

するときました。先ほどMacで登録したのと同じようにログインの高速化。
FaceIDを使ってデバイス登録を求められます。

しかし、すでにデバイス登録をMacでしているのでエラーが出ます。。。


iCloudで同期されているので登録済みって言われてます。

やはりパスキーが同期されている想定はなく、あくまでplatform認証器はデバイス登録に特化して利用、あくまで認証は外部キーを使うという整理になっていそうですね。






2024年1月27日土曜日

JWTのデコードをターミナル上で行う

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

皆さんIDトークンなどのJWT(JSON Web Token)の中身を確認するのに何を使っていますか?

私はOkta(Auth0)が提供しているhttps://jwt.ioやMicrosoftが提供しているhttps://jwt.msをよく使うのですが、いちいちブラウザを立ち上げるのが面倒な場合もありますよね。

もちろんjwt-cliを使ってコマンドラインで見るのもいいのですが、もうちょっとUIも凝ったものも欲しいよね、というVZ Editorが忘れられない人たちもこの界隈にはいるはずです。


ということで今回紹介するのはjwt.ioと同じくOkta(Auth0)が提供するjwt-uiです。

図)githubより


早速導入してみます。(私はMac環境ですが、Windowsでも使えるみたいです)

インストール

brewでインストールするようです。

brew tap jwt-rs/jwt-ui
brew install jwt-ui

これだけです。

起動

jwtui

これだけです。立ち上がりました。

デコード

UIを起動した状態でEnterを押下すると入力フィールドにフォーカスが当たるので、デコードするJWTをペーストできるようになります。
こんな感じで使えます。
もちろんコマンドラインから直接JWTを引数に指定してもデコードができます。
% jwtui eyJ・・・・という感じです。
するとUIが起動してデコードされた状態が表示されます。

jwt-cliと同じように標準出力にデコードされたものを出力することもできます。
% jwtui -sn eyJ・・・・という感じで使います。(-sは標準出力への出力、-nは署名検証をしない、というオプションです)

他にも色々とオプションがあるので使ってみてください。
  • -S, --secret <SECRET> Secret for validating the JWT. Can be text, file path (beginning with @) or base64 encoded string (beginning with b64:) [default: ]
  • -s, --stdout Print to STDOUT instead of starting the CLI in TUI mode
  • -n, --no-verify Do not validate the signature of the JWT when printing to STDOUT.
  • -j, --json Format STDOUT as JSON
  • -t, --tick-rate <TICK_RATE> Set the tick rate (milliseconds): the lower the number the higher the FPS. Must be less than 1000 [default: 250]
  • -h, --help Print help
  • -V, --version Print version






2024年1月6日土曜日

OpenID Providerを作ることでOpenID Connectを知る

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

OpenID Connectってシンプルなプロトコルだと思いますが、やっぱりOpenID Providerの気持ちにならないと本当のところはわからないよね、ということで「OpenID Providerを作る」シリーズ(デ⚫︎ゴ⚫︎ティーニ風)でもやってみようかと思います。

超絶ベーシックなところまでは前回・前々回のポストを踏まえて2時間くらいで作ってみたのでまずはこちらを解説しつつ実装を一緒に育てていきたいな、と考えています。

とりあえず作ったところまではこちらのレポジトリで公開しています。(前回のポストからの追加部分としては認可コードをJWEにしたところくらいです。詳しくはReadmeを見てください)

https://github.com/fujie/oidc-study-op


ということで、中身は次回から解説しますが現状の実装で何ができるのかの確認を兼ねてOpenID Connectの通信が実際にどうなっているのかを、Azure AD B2Cを使って確認してみようと思います。結構Azure AD B2CとかAuth0を触るときにサービス側が外部IdPにどういう期待をしているのかを知るためにこれまでも簡易IdPを作って通信トレースをとったりしていたのですが、この辺りの試行錯誤がOpenID Connectそのものを知ることにつながりますし、Azure AD B2CやAuth0などのIDaaSについての知識も深められて一石二鳥です。


早速Azure AD B2Cに作ったOpenID ProviderをIDプロバイダとして読み込ませてみます。作ったOpenID Providerはローカルで動かしていますのでngrokを使ってインターネットからアクセスできる様にしています。

ちなみにAzure AD B2Cに限らずMicrosoftのID基盤はresponse_modeとしてform_postをデフォルトにしているのですが、そんなものは作っていないのでqueryに変更してあげる必要があります。

free版のngrokを使っているのでngrokを止めてしまうとURLが変更されてしまうので注意が必要です。(もし止めてしまったら一度IDプロバイダを消して再作成する必要があります)


なお、ngrokを使う利点としてインスペクションができることです。(http://127.0.0.1:4040をブラウザで開くと通信内容がトレースできます)



Azure AD B2CでIDプロバイダの設定をして保存を行うとDiscoveryとjwks_uriへのアクセスがあります。


この状態でユーザーフローを作成し、実行してみます。


順調にIDトークンが発行され、ユーザ登録画面に遷移しました。


インスペクションを見るとOpenID Connectのフローに則って順次アクセスされていることがわかります。

まぁ、徐々に育てていきましょう。


2024年1月3日水曜日

ログインさせたいユーザを指定してIdPへFederationする(SAML/OpenID Connect)

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

SAMLでもOpenID ConnectでもFederation構成をしているとService Provider(SP)やRelying Party(RP)側であらかじめIdentity Provider(IdP)側で認証させたいユーザ名を指定したいケースがしばしばあります。
典型的なケースの一つは多要素認証をオンデマンドで実行させた場合で、普通のページには第1要素であるユーザ名とパスワードで認証、決済ページには追加要素で認証を要求する、というシナリオは結構あり得るシナリオです。この場合、第1要素で認証されたユーザと追加要素で認証されたユーザをSP/RP側で比較することで同じ人であることを検証することももちろん可能なのですが、できればあらかじめ追加要素で認証させたいユーザの識別子をSP/RPからIdPに渡してあげることで利用者が再度ユーザIDをIdP側で入力する必要がなくなるのでUXも向上します。
この様なシナリオは当然のことながらSAMLでもOpenID Connectでもサポートされています。

SAMLの場合

SAMLを使う場合、SPからのSAML Requestの中にSubjectを指定することができます。
OASISのSAML2.0 coreの仕様の3.4.1のAuthnRequestのエレメントの章に記載があるSubjectが該当します。
SAML 2.0 core仕様

https://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf

 こんな感じのリクエストになります。

<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
                    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
                    ForceAuthn="false"
                    ID="a133c62aafc8dcee7a69481de5af763c4ee370494"
                    IssueInstant="2024-01-03T03:28:40Z"
                    Destination="https://idp.example.jp/sso/login"
                    AssertionConsumerServiceURL="https://sp.example.com/acs"
                    ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
                    Version="2.0"
                    >
    <saml:Issuer>https://sp.example.com/sp</saml:Issuer>
    <saml:Subject>
        <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">test@example.jp</saml:NameID>
    </saml:Subject>
</samlp:AuthnRequest>
実際の動作は上記リクエストを受け取ったIdP側の実装に依存するので利用するIdPの仕様を確認してださい。ちなみにEntra ID(Azure AD)の場合はこの方法ではなくクエリパラメータにlogin_hint=test@example.jpという形で付加してリクエストを投げる形になります。(この辺りを参照:https://learn.microsoft.com/ja-jp/entra/identity-platform/single-sign-on-saml-protocol#subject)ただし、Entra IDが外部IdPとFederationしている時はlogin_hintではなくusername=test@example.jpという形でパラメータ名が異なるので要注意です。
また、Azure AD B2Cでは要求リゾルバという仕組みでSubjectの情報を取得することができるので、このサブジェクトに応じた処理を書けば割と自由に実装ができます。
Okta CIC(旧Auth0)はSAML RequestのSubjectをちゃんと判別してくれそうです。(この辺りを参照:https://community.auth0.com/t/pass-login-hint-to-saml-provider/92546

OpenID Connectの場合

こちらはシンプルにlogin_hint属性をクエリパラメータに付加することで実現できます。(仕様はこちらを参照;https://openid-foundation-japan.github.io/openid-connect-core-1_0.ja.html)こんな感じでAuthentication Requestにパラメータをつけるだけです。
HTTP/1.1 302 Found
  Location: https://server.example.com/authorize?
    response_type=code
    &scope=openid%20profile%20email
    &client_id=s6BhdRkqt3
    &state=af0ifjsldkj
    &redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb
    &login_hint=test@example.jp
こちらもSAMLと同様にIdPの実装に依存するので実際の動作はIdPの仕様を確認してみてください。ちなみにAzure AD B2Cの場合はSAMLと同じく要求リゾルバで属性の取得ができます。

ちなみに他にもヒント系のパラメータは色々とあります。
また、SP/RPから認証コンテキストを指定したい場合もあるのですが、現在SAMLについてはAuthnContextClassRefというパラメータがありますが、OpenID Connectについてはacr/amrをclaimsパラメータで渡す方法はありますが、レベルの指定方法の共通化をどうするべきか?についてはPam Dingleさんを中心にIntenet Identity Workshopで議論が続けられているので今後の注目ポイントかもしれません。

2023年12月18日月曜日

Worldcoinによる金融包摂とデジタルアイデンティティ

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

2023年も終盤に近づいてきたということで、今年もDigital Identity技術勉強会 #iddance Advent Calendar 2023に参加しています。


今回のネタはWorldcoinで話題のWorld IDを探っていきたいと思います。

ということでこんな内容でお届けします。

  • Worldcoinとは
  • World IDの取得と確認
  • Identity ProviderとしてのWorld ID
  • Incognito Actions(おまけ)

なお、お約束ですが本記事ではWorldcoinを含む特定の仮想通貨の購入や投資などを推奨するものではありません。あくまでDigital Identity関連技術の観点からWorldcoin/IDを見ていきたいと思います。


Worldcoinとは

Worldcoinというキーワードを検索するとOpenAIの創業者であるSam Altman氏が共同創業者した仮想通貨のプロジェクトという切り口で紹介されている記事が多くヒットしますが、本家Worldcoinのサイトを見るとこのように記載されています。

Worldcoin is an open-source protocol, supported by a global community of developers, individuals, economists and technologists committed to expanding participation in, and access to, the global economy. The Worldcoin Foundation is the steward, and will support and grow the Worldcoin community until it becomes self-sufficient. Tools for Humanity helped launch Worldcoin, and currently serve as advisors to the Foundation and operators of the World App.(原文)

ワールドコインはオープンソースのプロトコルであり、開発者、個人、経済学者、技術者からなるグローバルコミュニティによって支えられている。Worldcoin財団はスチュワードであり、Worldcoinコミュニティが自立するまでサポートし、成長させる。Tools for Humanityはワールドコインの立ち上げを支援し、現在は財団のアドバイザーとワールドアプリの運営者を務めている。(Deeplで機械翻訳) 

また、同サイトにはWorldcoinに関するホワイトペーパーも公開されており、その中に端的にWorldcoinはこのように解説されています。
Worldcoin was founded with the mission of creating a globally-inclusive identity and financial network, owned by the majority of humanity. If successful, Worldcoin could considerably increase economic opportunity, scale a reliable solution for distinguishing humans from AI online while preserving privacy, enable global democratic processes, and show a potential path to AI-funded UBI.(原文)

Worldcoinは、人類の大多数が所有する、グローバルに包括的なアイデンティティと金融ネットワークを構築することを使命として設立された。成功すれば、ワールドコインは経済機会を大幅に拡大し、プライバシーを守りながらオンライン上で人間とAIを区別するための信頼できるソリューションを拡大し、グローバルな民主的プロセスを可能にし、AIが資金を提供するUBIへの潜在的な道を示すことができる。(Deeplで機械翻訳)

要するに金融包摂の文脈で設立されたデジタルアイデンティティと金融ネットワークで、UBI(ユニバーサル・ベーシック・インカム)を実現することも一つのゴールとして定めている様です。

また、同時にWorldcoinを構成する要素についても以下のように説明が記載されています。

Worldcoin consists of a privacy-preserving digital identity network (World ID) built on proof of personhood and, where laws allow, a digital currency (WLD). Every human is eligible for a share of WLD simply for being human. World ID and WLD are currently complemented by World App, the first frontend to World ID and the Worldcoin Protocol, developed by the contributor team at Tools for Humanity (TFH).(原文)

ワールドコインは、個人であることの証明の上に構築されたプライバシーを保護するデジタルIDネットワーク(ワールドID)と、法律が認めるデジタル通貨(WLD)で構成されている。すべての人間は、人間であるというだけでWLDの分け前を得る資格がある。World IDとWLDは現在、Tools for Humanity (TFH)の貢献者チームによって開発された、World IDとWorldcoinプロトコルの最初のフロントエンドであるWorld Appによって補完されている。(Deeplで機械翻訳) 

なるほど、Worldcoinのサイトのトップに記載されていたWorld ID、WLD、World Appはそれぞれ以下のような関係性だということがわかります。(トップページからリンクされるそれぞれのページの解説文からも補完)

  • World ID:デジタルIDネットワーク
    • A more human passport for the internet. More powerful. More integrations. More human.(原文)
    • インターネットのより人間的なパスポート。よりパワフル。より多くの統合。より人間的に。(Deeplで機械翻訳)
  • WLD:デジタル通貨(Worldcoin Token)
    • A more human token freely, equally, and globally distributed to unique humans.(原文)
    • より人間的なトークンは、自由に、平等に、そしてグローバルに、ユニークな人間に配布される。(Deeplで機械翻訳)
  • World App:フロントエンドアプリケーション
    • More human access to the global economy with identity and finance for all. Privacy‑first. No fees. 24 hour support.(原文)
    • すべての人のためのアイデンティティと金融で、より人間らしいグローバル経済へのアクセスを。プライバシー第一。手数料無料。24時間サポート。(Deeplで機械翻訳)
なんとなくわかってきました。
要するに金融包摂(世の中には銀行等の金融システムにアクセスできない人たち、要するに銀行口座が持てず社会経済に参加できない人たちが多く存在する。その人たちの経済参加を促進すること。この辺りはThe World Bankのページが参考になります。)を実現するには、人類が区別されることなくアクセスできるアイデンティティ・ネットワークに支えられたユニバーサルなベーシック・インカムを含む金融システムが必要であり、Worldcoinはその理想を実現するためのプロジェクト、という位置付けということです。


World IDの取得と確認

では、早速World IDを取得してみたいと思います。
World IDアカウントを作成するのに必要となるのは、以下のものです。
  • スマートフォン(iOS/Android)にインストールするWorld App
  • SMSの受信できる携帯電話番号(なくてもアカウントは作成できます)
スマホを持っていない人は金融包摂的にどうなるのか?という疑問は抱きつつ、World Appをインストールしセットアップを続けます。

もちろんこの状態でもWorld IDは作成されているのですが、World IDのもう一つの特徴は本当に人(Human)であることをOrbというデバイスを使って確認(物理的にOrbが置いてある場所まで行って対面で確認を行う)を行うことにあります。

まだID確認を行なっていない状態だとアプリの上部にVerify your World IDというリンクが表示されるのでタップすると近所に存在するOrbの場所が表示されますので、場所によっては予約をした上で現地を訪問して存在確認を行います。なお、この際に虹彩登録を行う必要があることから謎のシステムやデバイスに生体情報を提供するのはどうなのか?という議論も存在します。確かに私も渋谷の指定の場所へ行ってOrbでID確認をしてきましたが、かなりカジュアルな感じで登録ができてしまうので、偽Orbを作って生体情報だけを搾取する人たちが出てきても不思議ではありません(Orbを操作してくれる人も、Orbそのものについても登録しようとしている人から見て正当性を確認する手段がない)。この辺りは今後の課題なんだと思います。

なお、ID確認時には法的なアイデンティティ・ドキュメント(免許証などの身分証明書)の提示は求められないので、この辺りは金融包摂のため、という考え方がベースにあるのだと思います。ただ、一人のユーザが複数のWorld IDを取得できないようにするための虹彩情報の突合・重複確認がどこまで本当に実施されているのか?などはよくわかりません。

こんな感じのデバイスが置いてあるのでアプリのQRを読み込ませた後で虹彩登録を行います。登録自体は5分もかからずサクッと終わります。


なお、このID確認を行わないとベーシック・インカムとなるWLDを受け取ったり取引することができません。ちなみにWorld Appをインストールすると定期的(週一回くらい?)にGrantといってベーシック・インカムとしての3〜10程度のWLDが付与されます。現時点で1WLDは日本円で368〜9円程度なので、隔週で1,000円もらえる感じです。実際に利用する際は暗号資産取引所などで日本円へ換金することもできるんじゃないかと思います。(やったことありませんが)※追記:12/18の朝にみたら爆上がりしてました。624円とかになってました。

いずれにしても確認が終わるとVerifiedとして記録がされます。



Identity ProviderとしてのWorld ID

さて、デジタルIDの話なので、あまり仮想通貨の話に行っても仕方がないのでWorld IDの使い方の話をしたいと思います。

非常にざっくりいうと、World IDもOpenID Connectに対応したIdentity Providerとしての機能を持っています。

開発者ポータルへアクセスし、サインアップすると一般のIdentity Providerと同じようにクライアント登録などができる仕組みが提供されています。

ちなみにAuth0(Okta CIC)ではすでにマーケットプレイスにSign in with Worldcoinの機能が提供されていますので、クライアントID/シークレットの登録とRedirectURIを設定すると簡単にWorld IDによるサインインが実装できます。

開発者ポータルでClient ID/Secret/RedirectURIの設定を行います。

こちらはAuth0(Okta CIC)の画面。Social Connectionsとして定義します。

Sign in with Worldcoinを起動するとQRコードが出てくるので、World AppでQRコードを読み込み、サインインします。

World App側でQRコードを読み込むとVerify with World IDの画面が表示される、確認に成功するとサインインされます。


World IDのOpenID Connectの実装に関してはドキュメントが公開されているので、こちらを見ると自作のWebアプリケーションや他のIDaaSへの接続も容易です。(最近World IDのバージョンが2.0に更新され、PKCEのサポートなどが追加されました)

簡単なRelying Partyを書いて実際のid_tokenの中身などを確認していきましょう。細かいコードは省略しますが、結果的にこんなid_tokenが返ってきます。


ポイントはこの辺りです。ドキュメントをみるとhttps://id.worldcoin.org/betaのエレメントはdepricateっぽいですが、verification_levelとしてOrbで確認済みのWorld IDかどうかがわかるような仕組みになっています。

  "https://id.worldcoin.org/beta": {

    "likely_human": "strong",

    "credential_type": "orb"

  },

  "https://id.worldcoin.org/v1": {

    "verification_level": "orb"

  },

ちなみに、Orbで確認を行なっていないWorld IDでもアクセスしてみるとverification_levelがdeviceとなっています。

  "https://id.worldcoin.org/beta": {

    "likely_human": "weak",

    "credential_type": "device"

  },

  "https://id.worldcoin.org/v1": {

    "verification_level": "device"

  },


ところで、Auth0でも簡単なRelying Partyでも実装できたので、ついでにAzure AD B2Cでも実装してみようと思います。Discoveryもサポートしているし、openid-configurationを見るといつもの鬼門のresponse_mode=form_postもサポートしているようなので試してみます。

こんな感じでIDプロバイダーを設定します。

ところが、response_modeをform_postにするとWorld IDのAuthorizationエンドポイントでWorld Appでサインインしたところjsのエラーが出て止まってしまいます。どうもCSPの設定がうまくできていないみたいですね。。。


ということで、response_modeをqueryに変更して再度試してみるとTokenエンドポイントへのアクセスでエラーが出ているようです。
ここは結構ハマったのですが、Postmanなどで順番にアクセスするとちゃんとid_tokenが取得できるので、Azure AD B2CがTokenエンドポイントへアクセスする際に何か変なヘッダがついていたりするんだろうな、、(あるいは逆にUser-Agentがないと返事をしないTokenエンドポイントがいたりするのでそういうケースかも、、)と思いダミーのTokenエンドポイントを作りPostman経由の場合とヘッダを比較。

結果、

expect: '100-continue'

が犯人でした。

PostmanでもexceptヘッダをつけるとWorld IDのTokenエンドポイントがエラーを出しました。どうやらContent-Lengthの事前通知には対応していないようです。

とはいえ、APIクライアントとなるAzure AD B2C側のリクエストをここまで細かいレベルで調整するのはカスタムポリシーを使っても無理っぽいので、現時点では諦めます。(どうしても実装する場合はTokenエンドポイントとの間にゲートウェイモジュールを立ててProxyさせる形になると思います)


Incognito Actions(おまけ)

ここからはおまけですが、World IDにはIncognito Actionsという機能があります。これはユーザがSign in with World IDを含むVerifyをする対象のアプリケーションを簡単に作るための機能です。(例えば、投票などが想定されています)
開発者ポータルからIncognito Actionsメニューから定義体を作っていくことができますが、その際にVerifyの回数の制限などをつけることができます。
例えば、Uniqueだと1つのWorld IDにつき1回しかVerifyができないようなアプリケーションが作れますし、2 Verificationsや3 Verificationsのように2回・3回まで許可する設定やUnlimitedのように制限なしの設定もできます。
本来はIDKitというSDKやAPIを使ってアプリケーションを構築していくことになるのですが、管理者ポータルからテストをするためのKioskモードが用意されているのでこちらから確認していきます。
Enable Kiosk〜Open Kioskでテスト用の画面が開きます。

先ほどのSign in with World IDと同じようにWorld AppでQRコードを読み込みます。今回はUniqueモードを設定したので最初の1回はちゃんとVerifiedとなります。
しかし、再度同じようにKioskを起動して同じWorld IDで確認をするとAlready verifiedとエラーが出ます。
簡単な投票や特典の配布などのアプリを作るのに良さそうですね。



ということで、Worldcoin / World IDを触ってみました。
金融包摂という社会課題への対応をしていくという方向性については共感できるものがありますし、うまく社会に浸透していくことができればベーシック・インカムはおいておいて金融システムからネグレクトされた人々にとっては救いになり得るのかもしれません。
ただ、先に書いた通りOrbの真正性などまだまだ情報の非対称性など粗いところも多く、まだまだポリシーやガバナンス面を含めやるべきことはたくさんあるんじゃないかと思います。Sam Altman氏もOpenAIで得られた知見や利益を、打ち上げ花火だけではなく、うまく実際の社会のために役立てられるといいですね。