ritou です。
Digital Identity技術勉強会 #iddance Advent Calendar 2023 のどこかの記事です。
今日はFedCMについて触れます。えーじさんがこのようなポストをされていたのでみなさん見ましょう。
この投稿にあるLogin Status API is 何?と気になってしまいますが、この記事ではそれ以前にFedCMのことを知らない、あるいは忘れてしまった方に向けてデモサイトを触ってみましょうという内容です。
そもそもFedCMとは何する仕組みなのか
ID連携を提供するサービス(IdP)と利用するサービス(RP)はそれぞれ独立したサービスであり、次のようなことをやろうとすると3rd Party Cookieを利用した工夫が必要でした。
IdP上で誰かがログインしているかどうかをRP上に表示する
IdP上でログインしているユーザーの情報をRP上に表示する
未ログイン状態でXとかMediumにアクセスした時に、「(ユーザー名)でログインしますか?」みたいなダイアログが画面の右上に表示されたり、Googleでログインみたいなボタンのところに名前が入ったりするのをみたことがある方もいるでしょう。
RP->IdP->RPと単純なリダイレクトで行き来するUXを改善させられるこのような取り組みを、3rd Party Cookieの利用なしでも動くように考えられているのがFedCMです。
登場人物
IdP: ID連携でユーザー情報を提供するサービス
RP: ID連携においてユーザー情報をログインなどに利用するサービス
早速挙動を見てみましょう。環境はChrome on MacOSです。
IdPで未ログイン状態
まずはIdPに誰もログインしていない状態です。
![](https://r2.sizu.me/users/1033/post-images/k8cco2dkvxtkk4h9s0c6.png)
何も起こっていないように見えますが、consoleでは "Not signed in with the identity provider." というエラーが出力されています。
IdPでログイン状態
IdPでログイン状態にします。
![](https://r2.sizu.me/users/1033/post-images/5z1mbafodfsvx17s1u95.png)
この状態で、RPにアクセスしてみます。画面の上部になんか出てるのが分かりますね。これで続行するとログインできます。
![](https://r2.sizu.me/users/1033/post-images/fw8zsuvm8bifn351wei6.png)
みたいな感じですね。
IdPでセッションが有効期限切れ
IdPでAccount Statusを "Session Expired" にしてみます。
![](https://r2.sizu.me/users/1033/post-images/u5fzchrkn0ft148fu21x.png)
そして再びRPを訪れると、表示が変わります。"IdPにログインしてサクッと使わんか?" みたいな感じですね。
![](https://r2.sizu.me/users/1033/post-images/24mis4b1ht7ur7a5dru3.png)
ここで続行を押すとどうなるでしょうか。PC環境の場合、小さいウィンドウが立ち上がってIdPにログインできます。ログインして続けると、上述のIdPにログインしている状態と同じ表示となります。
![](https://r2.sizu.me/users/1033/post-images/517x237bd14era133s8x.png)
次はエラーケースを見てみましょう。
IdPがInvalid Requestを返す
IdPでAccount Statusを "Invalid Request" にしてみます。
![](https://r2.sizu.me/users/1033/post-images/0exbwb813hwcdo8a7tr7.png)
RPを訪れると、IdPでログインしているユーザーの情報は出てくるものの、続行するとエラーが出ます。
![](https://r2.sizu.me/users/1033/post-images/in2815bfoo41196zvht7.png)
他にも "Unauthorized Client", "Access Denined", "Server Error", "Temporarily Unavailable" と言うstatusが用意されており、挙動が少しずつ異なります。
Unauthorized Client
![](https://r2.sizu.me/users/1033/post-images/6o6xm0m7d6zhia1e2n47.png)
Access Denined
![](https://r2.sizu.me/users/1033/post-images/91nwu4920v75ekhb5xzt.png)
Server Error
![](https://r2.sizu.me/users/1033/post-images/4ce1x6vrsio3n8zooc35.png)
Temporarily Unavailable
![](https://r2.sizu.me/users/1033/post-images/60ex7z0s9mxt3obh4riw.png)
何をしてるのかというと、ブラウザが仲介してIdPにアクセスしたときに色々なエラーが返される可能性があり、そこでどう言う挙動になるかを確認できるぞっていう話です。
ここまでをみて、全体のシーケンスが気になってきた方もいるでしょう。そのような方は、開発者向けのドキュメントを見て実際に手を動かしてみることをお勧めします。
RP, ブラウザ, IdPの関係はこんな感じです。
![](https://r2.sizu.me/users/1033/post-images/s5fdro9tb6nrwmveta4h.png)
そしてシーケンスは結構長いことが知られています。
![](https://r2.sizu.me/users/1033/post-images/2kx0zc72hoox80ruwhaz.png)
WebOTPやPasskeyでもお馴染みの "navigator.credentials.get" が利用されています。えーじさんもおっしゃっている通り、冬休みの課題として読んでみてはいかがでしょうか。
以上、今回はFedCMのデモサイトの触り方を紹介しました。以前よりもエラーケースの再現ができるようになっていました。前にこのフローとOIDCの差分などを調査して勉強会で発表したことがありますが、そこからどれぐらい仕様が進化したのかを調べてみたいと思います。
PasskeyのUXには敵わないと言われているID連携ですが、IdPに誰がログインしていてそれが視認でき、シームレスに誘導できるのであればワンチャンあるかもしれません。是非注目してみてください。
ではまた!