ヌーラボアカウントのWebAuthn/FIDO対応をチラ見する

f:id:ritou:20190705105729p:plain

こんにちは、ritouです。

不正ログインが起こらない平和な世界を目指す 開発者です(意識高い)。

ちょっと前に「決定!」というプレスリリースに「決定!お、おぅ...」となったことから全てが始まりました。

その後、βテストというものに参加させていただきました。

そして宣言通り、7月1日にリリースされたようです。

どんな感じか見てみましょう。

新規登録

現状では、新規登録の時はパスワードベースです。

f:id:ritou:20190705010548p:plain

登録するとメールによる確認が行われます。

f:id:ritou:20190705010700p:plain

セキュリティ デバイスの登録は「セキュリティ」->「セキュリティ デバイスの登録」と進みます。

セキュリティ デバイスの登録

f:id:ritou:20190705011254p:plain

ローカル認証を必須とする、いわゆる UserVerification=true が指定されているようです。

f:id:ritou:20190705011741p:plain

f:id:ritou:20190705011906p:plain

この後、自分で名前をつけます。

f:id:ritou:20190705012132p:plain

登録完了ですね。

f:id:ritou:20190705012213p:plain

複数登録できて、削除もできます。

セキュリティ デバイスを登録した時に「セキュリティイベント」と言うところに履歴が残されています。 βテストの時に気付きませんでしたが、クレデンシャルの状態変更と言う意味ではこのイベントもメールにて通知する機能があっても良いかもしれませんね。

ログイン

ログインでは、最初にメアドを入力します。

f:id:ritou:20190705012332p:plain

セキュリティ デバイスの登録があればそれでログインするように分岐します。

f:id:ritou:20190705012452p:plain

ResidentKeyによるユーザーネームレスなフローは使っていないようですが、対応状況やユーザーによって認証方式が異なる場合があるケースでは現状の実装で良さそうですね。

パスワード認証、セキュリティ デバイスを用いた認証のどちらからでも、新しい端末からのログイン時には「ログインアラート」が送られます。

以上がヌーラボアカウントにおける登録・認証フローのWebAuthn/FIDO対応です。

PCの画面を紹介しましたが、Android端末とかからも基本的に同じ感じだと思います。

現在のWebAuthnの対応状況において既存の認証方式への影響を抑えつつ、新しい認証方式を取り入れることをシンプルに表現されていると思います。

パスワードレスに向けて

今後、パスワードレスに意識を向けていくにあたり、わずかに残っているパスワード認証への依存を取り除くことで、WebAuthn/FIDOではなくSMSの扱いなど、複数の認証方式に対応できる設計ができると思います。

  • 新規登録 : パスワード/メアド入力の後にメール確認 -> メアド入力してメール確認した後にパスワードの設定/セキュリティ デバイスの登録
  • リカバリー : 登録済みのメアドにメールを送った後にパスワード再設定 / セキュリティ デバイスの削除、再登録を可能にする

参考 : WebAuthn など新しい認証方式を受け入れる際の「アカウントリカバリー」の考え方 - Qiita

関連機能

ヌーラボアカウントには下記の3つの機能があります。

  • ログインアラート : ログイン成功時に登録されているメールアドレスに通知
  • ログイン履歴 : ログイン方法や日時などの情報が保存されており、閲覧可能
  • セキュリティイベント : セキュリティキーの追加などの情報が保存されており、閲覧可能

これらがあれば、最近よく聞く不正ログインなどにも気付けそうですね。

個人的には、セッション管理&破棄の仕組みが「明示的に」提供されているともう言うことありません。

参考 : ユーザー認証の緊急事態に備えて提供しておきたい、セッション管理とセキュリティイベントログについて - Qiita

パスワード認証ではパスワードリセットのタイミングで既存のセッションを切ったりする設計もそこそこ一般的ですが、WebAuthn/FIDOの場合はどうでしょうかね。 この辺りも認証方式とセッション管理の依存を切り離して、ユーザーが任意のタイミングで管理できる形が良いのかなと思います。

まとめ

ヌーラボアカウントのWebAuthn/FIDO対応を見てみました。

  • 既存のパスワード認証に与える影響を抑えつつ認証方式を追加するシンプルな実装
  • 関連機能も揃っており、ユーザーが安心して使えそう
  • パスワードレスへの移行の第一歩として定番の実装形式と言えそう

以上です。

builderscon tokyo 2019にてUXについての話をする予定なので、ヌーラボアカウントについても紹介したいと思います。

builderscon.io

あ、navigator.credentials.* を呼び出したりするときにJavaScriptからFIDO2 Serverっぽいエンドポイントを叩いてるみたいな細かい話を書くのを忘れてました。 別途まとめます。

ではまた。

CIBAの認証フローを体験するためのWebアプリ(途中経過)

おはようございます、ritouです。

ちょっと前から少しずつ作ってたのやつの途中経過です。

CIBAについてはこの辺りの記事をどうぞ。

ritou.hatenablog.com

ritou.hatenablog.com

今回やりたいこと

CIBAの認証フローをデモできる環境を作りたいなーと思っていました。

  • Webアプリ + プッシュ通知でAuthentication Deviceっぽく振舞わせたい
  • 最初は本当に最小限の実装
  • エンドポイントは開放して触れるようにしておく

ちなみに裏でAuthleteは使ってません。使ったらもっと楽にできそうですね。

Client登録

Client名を指定して Client Credentials を取得できます。

$ curl "https://oidc-ciba-demo.gigalixirapp.com/api/client" -d "name=SAMPLECLIENT"
{"client_id":"01DCCK4B1Z(masked)","client_secret":"01DCCK4B22(masked)","name":"SAMPLECLIENT"}

Authentication Deviceの設定

URL

とりあえずPC/AndroidChromeあたりで動くWebアプリをADとして利用します。

URL : https://oidc-ciba-demo.gigalixirapp.com/

OIDCIBADEMO_URL

ログインとプッシュ通知の設定

Firebase Cloud Messaging を利用します。サポートされていない環境では動きません。

まずログインします。

Screenshot_20190603-022503

Push通知も設定します。

Screenshot_20190603-022547

これで準備完了です!

Screenshot_20190603-022612

ちなみにログアウトしたらメアドはDBから削除されてプッシュ通知も来なくなります。

Authentication Flow

Authentication Request

このリクエストが正しく処理されるとプッシュ通知が飛んでいくはずです。

$ curl -X POST "https://oidc-ciba-demo.gigalixirapp.com/api/backchannel" -H "Authorization: Basic MDFEQ0NLNE(masked)" -d "scope=openid&login_hint=ritou.06@gmail.com"
{"auth_req_id":"01DCCKYE67JK0AGD08XC9E4EQD","expires_in":3600}

OpenID Provider Obtains End-User Consent/Authorization

まずは通知が来ます。

Screenshot_20190603-023221

いわゆる同意画面です。

Screenshot_20190603-023250

完了です。

Screenshot_20190603-023307

Token Request Using CIBA Grant Type

ClientはTokenエンドポイントから各種トークンを取得できるようになりました。

$ curl -X POST "https://oidc-ciba-demo.gigalixirapp.com/api/token" -H "Authorization: Basic MDFEQ0NLNE(masked)" -d "grant_type=urn:openid:params:grant-type:ciba&auth_req_id=01DCCKYE67JK0AGD08XC9E4EQD"
{"access_token":"THISISDUMMYACCESSTOKEN","expires_in":3600,"id_token":"eyJhbGciOiJSUzI1NiIsImtpZCI6InJzMjU2XzIwMTkwNiIsInR5cCI6IkpXVCJ9.eyJhdF9oYXNoIjoiblQ1bjZicEJyZGlPWmFCcDZJcXdrUSIsImF1ZCI6IjAxRENDSzRCMVpOR0NQNEJLOTVKVFQ5WThCIiwiZW1haWwiOiJob2dlQGV4YW1wbGUuY29tIiwiZXhwIjoxNTU5NTAwNDQ2LCJpYXQiOjE1NTk0OTY4NDYsImlzcyI6Imh0dHBzOi8vb2lkYy1jaWJhLWRlbW8uZ2lnYWxpeGlyYXBwLmNvbSIsInN1YiI6ImVvZ24wV2FrOXBMQWN1WkQyYkhwRWciLCJ1cm46b3BlbmlkOnBhcmFtczpqd3Q6Y2xhaW06YXV0aF9yZXFfaWQiOiIwMURDQ0tZRTY3SkswQUdEMDhYQzlFNEVRRCIsInVybjpvcGVuaWQ6cGFyYW1zOmp3dDpjbGFpbTpydF9oYXNoIjoiRXNROFN5cjR1NWhYbUt4SjltbWlIUSJ9.pE_jdSYwkw7FK4QbBnAXXvWSFTsesTLMglAygEuyuYk5Y5HKwrxzoUEwo_d_mZB4U4V6m8mFNIZqcOrP_cdrSwIOZNgH1BkSJucyzS47SgxgfR-X3y4cmPyCAzkHuJdbMao-ev27cbX9xFtlpw5cS4uIk4pHGtKtLJnhoIowQIpd34tXGPjLxuoOo-3P9N0iYZO6RlxL20N_MucbT4NwrZCgQAQSx_QrVUZjEtsi_OtXo-QRiDXAWILSgwxSpatFcLh6ITQlNNn1U03A5aguTnZRITnbJQoqBmaPRvfIC7Y_cc7N5SCnqpHJFBN2qGfOQTquoP0Vu0FT9eGOHAc8_w","refresh_token":"THISISDUMMYREFRESHTOKEN","token_type":"Bearer"}

ID Tokenをデコードするとこんな感じです。

JWT Header and Payload

まとめ

  • メアドを login_hintにして Poll モードで動かすデモです
  • ClientはDynamic Registrationで誰でも使えます
  • 仕様の他のところは暇なときにいじっていきます

BuildersconにCIBAなどに関連したセッションを応募したので、採択されるといいなーと思っております。

builderscon.io

以上。

Software Design 6月号にWebAuthnなど認証についての記事を書きました

こんばんは、ritouです。

タイトルの通り、ちょっと書きました。

gihyo.jp

「WebAuthn」が導く新時代のパスワードレス認証 【前編】FIDOとWebAuthnが変えるもの …… いとうりょう

6月号では前編として、今使われている認証方式とFIDOの違い、WebAuthnの概要という、個人的には2018年のアウトプットのまとめみたいな記事となっています。

ターゲットとしてはidconに来てくれるようなIdentity Professionalではなく初学者向けのような内容だと思います。 私の知り合いの方々は読まれても物足りない感じになるかもしれませんがご了承ください。

(うまくいけば?)7月号で自サービスにWebAuthn/FIDOを導入するためのポイントというこれまた去年のアウトプットをまとめたような記事が後編として載る予定です。

んで、ちょうど技術書典の直前にこの記事を書いていたため、「文章を書くのって大変だな。。。」「ブログとは違うよな」とか色々思いながら過ごしていました。 5/29に iddance やるぞ!と言い出したのもその影響が出ているかもしれません。

idance.connpass.com

申し込み数が100人に迫っていてありがたいです。 後半のWebAuthnネタは初学者には辛いかもと思うぐらいの濃い内容になりそうが、俺得レベルの濃い話を楽しげに話す人の話を聞くのも良いものです。

ちなみに、この執筆のお声がけをいただいたのは、昨年のbuildersconの発表を聞いたことがきっかけらしいです。 builderscon素晴らしいですね。ということで今年もCfPを出しています。

builderscon.io

昨今のAuthenticator/Clientの対応状況を見ると、いよいよサービスがWebAuthn/FIDOの導入を意識できる段階に入ってきたと思います。 UXに注目して具体的な導入イメージを持てるような話ができればと思っています。 当選するかどうかわからないですが、興味がある方は拡散などお願いします。 OAuth/OIDCあたりでもうひとネタぶっ込みたい。。。

ではまた!

Identity Dance School ってのはじめます。初回は5/29で技術書典特集!

こんばんは、ritouです。

来月の話ですが、こんなのをやります。

idance.connpass.com

Digital Identityの勉強会といえば idcon ってのがあります。

idcon.org

最新の技術トレンド、トピックについて最高レベルの情報が集まり、議論される場と言っても過言ではありません。

その分、参加および発表の敷居が高いと思われているのではないか、とも思っています。

そこで、

  • 初学者も気軽に参加できる
  • ちょっと何かやってみた技術者が発表できる

ような勉強会があると良いのかなと思っていました。

そこで今回用意したのが Identity Dance School です。

f:id:ritou:20190419185830p:plain

なぜDanceか?というあたりは、OAuthの一連のリダイレクトフローのことをOAuth Danceと呼ぶ(ある人はFAPI Dance, OIDC Danceなどとも言ってる)あたりから採用しました(tkudos さんとのやりとりから採用)。

内容というか方針はまだあんまり細かく決めていませんが、とりあえず気軽にDigital Identity技術に触れられる機会を用意できればと思っています。

一番最初に紹介した第1回の勉強会では、技術書典でDigital Identity技術に関する本を出したメンバーに声をかけさせていただきました。

技術書典にて、発表者が出した本をきっかけにしてこの分野に新しく興味をもった方もいらっしゃるのではないでしょうか?いないか?ちょっとぐらいいるっしょ?もしいたら、本の著者と交流して、今後もこの分野に興味を持ってもらえればと思います。

発表者、話の内容は初学者のレベルじゃないので、idcon の常連クラスの人たちもポイントポイントで楽しめるんじゃないかと思います。

そんなところで、定員を80名に増やしときましたのでお時間のあるかたは参加をお願いします。

idance.connpass.com

そう言えば、「行動規範」みたいなのはないのかと聞かれましたが、このレベルの集まりでがっつり用意するのもちょっと大変なので、主催者の私が会場提供する所属企業から怒られない程度の「常識的な範囲」でお願いします。

ではまた。

SPAなClientがトークンを安全に扱えるかもしれない拡張仕様「OAuth2.0 DPoP」とは

おはようございます、ritou です。

今日は日頃の情報収集方法の一つである Mike Jones氏のブログ記事に書いてあったドラフト仕様のご紹介です。

self-issued.info

The specification is still an early draft and undergoing active development, but I believe the approach shows a lot of promise and is likely to be adopted by the OAuth working group soon.

まだDraft中のDraftな状態ですが、まいくたんの推し感が出ているのでざっと見ておきましょう。

OAuth2.0 DPoPとは?

tools.ietf.org

This document describes a mechanism for sender-constraining OAuth 2.0 tokens via a proof-of-possession mechanism on the application level. This mechanism allows to detect replay attacks with access and refresh tokens.

Sender Constrained Token については、この辺りから復習しましょう(この前までちょっと内容間違ってたけど修正しました)。

ritou.hatenablog.com

切符はBearer, 国際線の航空券はSender Constrained Tokenみたいな表現のやつです。

f:id:ritou:20190419023842p:plain

OAuth 2.0のAuthorization Code Grantにおいて、

  • Authorization Code, Refresh Token : Sender Constrained Token
  • Access Token : Bearer Token

であるみたいな内容ですが、これはClient Credentialsを安全に管理できるConfidential Clientのお話です。 SPAで動くようなPublic Clientの場合、PCKEを用いてAuthorization CodeをリクエストしたClientに紐付けるぐらいしかできませんでした。(Implicitのことは忘れろ。)

そして、OAuth 2.0におけるproof-of-possession mechanismの2大仕様と言えばこの2つです。

今回のDPoPはこれらを使えないSPAのようなアプリケーションが扱うAccess Token, Refresh Tokenをアプリケーションレベルで "Sender-Constrained Token" にするための仕様です。Confidential ClientもClient認証と組み合わせられるとあります。

細かいところはこれから変わっていくと思いますが、とりあえず重要なところをつまんでいきます。

基本的な流れ

OAuth 2.0 の Authorization Code Grant で Access Token / Refresh Token を発行し、Protected Resource にアクセスするまでの流れを振り返りましょう。

f:id:ritou:20190419001113p:plain

DPoPの対象となるのは、

  • Access Token Request / Response : Client ID, Authorization Code から Access Token / Refresh Token 発行 (Binding)
  • Resource Access w/ Access Token : Access Token を用いたリソースアクセス (Proof)
  • Access Token Refresh Request / Response : Client ID, Refresh Token から Access Token / Refresh Token 発行 (Proof, Binding)

の部分です。Bindingと書いたところで紐付けを行い、Proofと書いたところで紐付けを証明します。

Access Token Request / Response での Binding

Client が Authorization Code を Token Endpoint に送る際、DPoP-Binding ヘッダを指定します。

POST /token HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
DPoP-Binding: eyJhbGciOiJSU0ExXzUi ...

grant_type=authorization_code
&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb
(remainder of JWK omitted for brevity)

この DPoP-Binding ヘッダに指定する値は以下のようなPayloadを含むJWTです。

{
    "typ": "dpop_binding+jwt",
    "alg": "ES512",
}.{
    "jti": "HK2PmfnHKwXP",
    "http_method": "POST",
    "http_uri": "https://server.example.com/token",
    "exp": "...",
    "cnf":{
        "dpop+jwk": {
             "kty" : "EC",
             "kid" : "11",
             "crv" : "P-256",
             "x" : "usWxHK2PmfnHKwXPS54m0kTcGJ90UiglWiGahtagnv8",
             "y" : "3BttVivg+lSreASjpkttcsz+1rb7btKLv8EX4"
        }
    }
}
  • typ : bindingの時は dpop_binding+jwt, proof
  • alg : none, HS系はダメよ
  • http_method : リクエストのHTTPメソッド
  • http_uri : リクエストのHTTP URI
  • exp : 有効期限
  • cnf : 公開鍵の情報を指定する。bindingの時は必須。

Clientは鍵ペアを生成して秘密鍵を保存しつつ、このようなPayloadに秘密鍵を用いた署名したJWT(JWS)を生成して指定します。 Authorization ServerはこのJWTを検証して公開鍵とAccess Token / Refresh Tokenを紐付けます。

そして、レスポンスでは token_type の値が Bearer+DPoP となります(例は記載されていませんがRFC6749の例をいじるとこんな感じになりそう)。

     HTTP/1.1 200 OK
     Content-Type: application/json;charset=UTF-8
     Cache-Control: no-store
     Pragma: no-cache

     {
       "access_token":"2YotnFZFEjr1zCsicMWpAA",
       "token_type":"Bearer+DPoP",
       "expires_in":3600,
       "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
       "example_parameter":"example_value"
     }

Authorization ServerがどうやってAccess Tokenに公開鍵を紐付けるかについては、JWT形式にしてそのまま公開鍵情報を含んでしまうもしくはバックエンドで持っておくとか、よしなに実装します。

Proof

Clientは Bearer+DPoPトークンを利用する際に、DPoP-Proof というヘッダを利用します。

Access Token @ Protected Resources

Access Token を用いて Resource Server にアクセスする時はこうなります。

     GET /resource HTTP/1.1
     Host: server.example.com
     Authorization: Bearer mF_9.B5f-4.1JqM
     DPoP-Proof: eyJhbGciOiJSU0ExXzUi ...

そしてヘッダに指定される値のPayloadはこうなります。

{
    "typ": "dpop_proof +jwt",
    "alg": "ES512",
}.{
    "jti": "HK2PmfnHKwXP",
    "http_method": "GET",
    "http_uri": "https://server.example.com/resource",
    "exp": "..."
}

typ の値に注目ですね。 リクエストを受けたResouce ServerはAccess Tokenに紐付けられた公開鍵でDPoP-Proofヘッダに指定されている値の署名を検証します。 Authorization Server と Resource Server が分かれてる時の公開鍵の扱いとかはよしなにやると。

Refresh Token @ Token Endpoint

Refresh TokenからAccess Tokenを要求するところでも DPoP-Proof ヘッダをつけます。

POST /token HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
DPoP-Proof: eyJhbGciOiJSU0ExXzUi ...

grant_type=refresh_token
&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA
...

このレスポンスに含まれる Access Token にはリクエストの Refresh Token に紐付けられた公開鍵が同様に紐付けられます。

公開鍵の表現

Access TokenがJWT形式だった時やToken Introspection API でRS / AS 間で公開鍵を表現する時は、cnf というクレームを利用します。

まとめ

とりあえず、今書いてある内容をざっくりと見ていきました。

  • mTLSとかToken Binding使えないClientにSender Constrained Tokenを発行し、AS/RSが検証できるようにするための仕様
  • 新しいHTTPヘッダを利用
  • 公開鍵暗号方式を利用
    • Bindingの時は公開鍵情報と署名
    • Proofの時は署名
  • 攻撃者が一旦偽AS/RSを立ち上げてClientからリクエストを受け取り、それを正しいAS/RSに向けても、検証して気づける

細かいところは今後変わるかもしれません。 鍵ペアや公開鍵の扱いなどはWebAuthnの登録/認証機能のあたりがイメージできる人だとすんなり理解できるかもしれません。

SPA向けと言いつつ、じゃあ秘密鍵をどこに保存すりゃいいのかとかもうちょっと補足がないとClientが安心して使えないかもしれませんが、PKCEとこれの組み合わせで「だいぶ」安全になるなら結構使える仕様なんじゃないかなとか思ったりしています。

今後に期待しましょう。

あれ、何かの告知を忘れている気がする...次回でいっか。

ではまた!

Android端末をGoogleの2段階認証のセキュリティキーとして使ってみる

おはようございます、ritouです。

こんなTweetを見かけたので試してみました。

www.itmedia.co.jp

環境

設定

手順はここに書いてあります。

support.google.com

既に2段階認証を設定してあればすっとできそうです。 2段階認証でセキュリティキー追加を選択します。

f:id:ritou:20190411101323p:plain
2段階認証でセキュリティキー追加を選択

以前はセキュリティキーを刺してください。だけだった気がしますが、Android端末も候補に出て来ました。

f:id:ritou:20190411101440p:plain
私のAndroid端末も候補に出て来ました

選択すると説明があります。

f:id:ritou:20190411101555p:plain
追加するよっていう説明

f:id:ritou:20190411101625p:plain
追加しましたよっていう説明

設定終わり。

f:id:ritou:20190411101916p:plain
完了

もともとスマホのPush通知でログインする機能を有効にしていてわかりづらかったのでその辺を無効化して試してみます。

認証

パスワード認証後に2段階認証の画面が出て来ます。

f:id:ritou:20190411101940p:plain
パスワード認証後、セキュリティキーでログインする画面になる

URLバーを見て!webauthnって書いてあるよ!(大興奮)

この時手元のスマホではこんな感じになります。

f:id:ritou:20190411102306j:plain
Android端末の方では確認だけ

OKしましょう。

f:id:ritou:20190411102402j:plain
処理中です

PCの方でログイン成功です。

f:id:ritou:20190411102518p:plain
ログイン成功

Bluetoothのペアリングがいらないってのが特徴ですね。 単純にスマホにPush通知を送るタイプとかと比べると、世界のどこかで攻撃者が試したタイミングででよくわからずOKしちゃうリスクもあるわけですが、この方法では近くにあるスマホのみ使えると言う点で安全と言えるでしょう。

OAuth/OIDCとかと違って細けぇところをリダイレクトとかで調べにくいのでふんわりですが、YubiKeyとかのセキュリティキーを買うとは思えない層への普及が見えて来ましたね!

以上です。 ではまた。

OIDC Client Initiated Backchannel Authentication Flow (CIBA)とは - 詳細もとい感想編

ritouです。

前に概要編を書きました。

ritou.hatenablog.com

この続き、具体的なリクエスト/レスポンスについてはこの記事に書いてあるじゃん。 もうこれ読めばいいのでは? スヤァ...としばらく過ごしてました。

qiita.com

そして先日、OpenID TechNightというイベントのLTでCIBAのお話があり、前半の内容と関連するとして概要編のリンクを載せてもらいました。

speakerdeck.com

Qiitaの記事でパラメータの説明などは詳しく書いてあるので似たようなこと書くのやめて、開発者視点から見た感想にしようと思い重い腰を上げました。

で、仕様はこちらです。

openid.net

寝かせておいたらCore 1.0 draft-02になってる!

概要編とのつながりを大事にして、まずは3つのモードの実装面の違いを見ていきましょう。

1. Poll mode

f:id:ritou:20190214014808p:plain

特徴としては

Poll : Client は OP の Token Endpoint をポーリングして応答を受け取る

と言うことで、OPとしては「ADでユーザーの同意もらうわ。終わったらトークンあげるから、定期的に連絡して。」てなばかりに Clientがポーリング(=インターバル取りつつリクエストしまくる)する感じです。

OPが実装すること

  • Backchannel Authentication Endpoint : CIBA 用の最初のリクエストを受けるエンドポイント
  • Authentication Device (AD) 上でのユーザー認証(検証?)/認可処理
  • Token Endpoint における CIBA 用 GrantType のサポート

最初の2つはCIBAのキモなので他のモードでも必要です。

それ以外に必要なのは Token Endpoint の拡張だけなので、OP側の実装はシンプルです。 が、Client / End User の数が増えると Token Endpoint にリクエストが集中する可能性があるので負荷を考慮する必要がありますね。 エラー処理下手くそなClientとか出されると辛いかもしれません。

Clientが実装すること

  • Backchannel Authentication Endpoint へのリクエス
  • Token Endpoint へのリクエスト(ポーリング)

基本的にリクエストを送るだけなので、既存の OAuth / OIDC の仕組みと大きくは変わらない気もします。 OP側の負荷に繋がるため、特に Token Endpoint に送られるリクエストのエラーハンドリングはちゃんとしないといけません。

2. Ping mode

f:id:ritou:20190214022248p:plain

特徴としては

Ping : 事前に Client が登録しておいた Callback URI に対して OP が認証の識別子と共に通知用のリクエストを送る。 Client は Token Endpoint からトークンを取得する。

と言うことで、OPとしては「ユーザーとのやりとりが終わったら連絡するー。そしたらトークン取りに来て。」みたいな感じです。

OPが実装すること

  • Backchannel Authentication Endpoint : CIBA 用の最初のリクエストを受けるエンドポイント
  • Authentication Device (AD) 上でのユーザー認証(検証?)/認可処理
  • Client Notification Endpoint への通知
  • Token Endpoint における CIBA 用 GrantType のサポート

Poll モードとの違いはOPからの通知のところですね。

OPからClientへ向けたリクエストってのは既存の OAuth 2.0 / OIDC にはない処理ですが、OP側はHTTPのリクエストを送るだけなのでそれほど難しくはなさそうです。

そして、Client がこの通知をちゃんと待っていられたら、Token Endpoint へのリクエストは必要最低限に抑えられます。

Clientが実装すること

  • Backchannel Authentication Endpoint へのリクエス
  • Client Notification Endpoint にて通知を受ける
  • Token Endpoint へのリクエス

当然、通知を受ける実装が必要となります。 この辺りは、Client側の開発スタイルにちょっと影響を与えるかもしれません。

既存の OAuth / OIDC において、http://localhost:4000/oidc/callback みたいなURLを redirect_uri などに設定、ローカルで立ち上げたWebサーバーとリダイレクトして...ってやってるところも多いのではないでしょうか? リダイレクトで繋ぐことはできても、OPからローカルのサーバーに通知を送るが困難なケースがあるでしょう。

最終的に Token Endpoint にリクエストを送るので、ローカルな環境ではこの部分の回避策を取りつつ Poll モードのように実装して、ちゃんとした動作確認はステージングやサンドボックス的な環境を用意して...みたいな話になるかもしれません。

3. Push mode

f:id:ritou:20190214022704p:plain

特徴としては

Push : 事前に Client が登録しておいた Callback URI に対して OP がトークンを含むリクエストを送る。

と言うことでOPとしては「終わったらこっちからToken送るわ。待ってて。」みたいな感じです。

OPが実装すること

  • Backchannel Authentication Endpoint : CIBA 用の最初のリクエストを受けるエンドポイント
  • Authentication Device (AD) 上でのユーザー認証(検証?)/認可処理
  • Client Notification Endpoint へのレスポンスの送信

Ping モードとの違いは TokenResponse も Client に送っちゃうところです。 となると、既存の OAuth 2.0 / OIDC のエンドポイントと言うか処理と完全に分離できそうですね。 CIBA導入による既存のシステムへの影響も"それなりに"抑えられるかもしれません。

Clientが実装すること

  • Backchannel Authentication Endpoint へのリクエス
  • Client Notification Endpoint にてユーザーとのやりとりの結果を受ける

Ping モードで出て来たローカル開発時の懸念、この Push モードだと詰みそうですね。 OP / Client 共に、どのモードをサポートするかの検討時に覚えておくと良さそうです。

何たらこんしだれーしょんを読もう

RFCIETFのDraftで仕様を読むとき、パラメータやフローの説明はもちろん大事ですが、設計や実装まで行う場合は Security / Privacy Consideration をしっかり読んでおくのが良いでしょう。

ということで、ここからは仕様の後半に記載されている内容を取り上げます。

ヒント

Qiitaの記事でも言及がありますが、ユーザー識別のために3つの識別子が利用できます。

  • login_hint_token : エンドユーザーを識別する情報を含むトーク
  • id_token_hint : OPが過去に発行したID Tokenも指定できる
  • login_hint : メアドや電話番号、ユーザーIDなどOPがユーザーを識別するためのエンドユーザーに関するヒント

SecurityConsiderationでは次のような記述があります。

The login_hint_token SHOULD be digitally signed by the issuer. This ensures authenticity of the data and reduces the threat of an injection attack. The signature allows the OP to authenticate and authorize the sender of the hint and prevent collecting of user identifiers by rogue Clients.

login_hint_token は発行者によってデジタル署名をつけるべき。データの信頼性が保証され、インジェクション攻撃の脅威が軽減される。この署名により、OPはヒント送信者を認証でき、不正なClientからの識別子の収集を防ぐことができると。 個人的にちょっと前から気にしているスクリーニング対策としてはこれが良さそうですね。

An id_token_hint cannot be validated using standard JWT processing rules because the token is being used in a context (sent from the Client back to the OP) that is different than that for which it was originally issued (typically a short lived token issued by the OP intended to convey claims about the authentication of an end-user to the Client).

過去にOPによって払い出されたID Tokenを使うってことは、有効期限を検証する本来のJWTの検証とは異なる使い方になります。 iss, audを検証するのはもちろんですが、署名検証となるとキーローテーションに関係してくるのでOPは過去に有効だった鍵の情報も保持したりする必要があります。 ってことで、id_token_hintを受け入れるのはあんまり筋が...ってなりますね。

Given these restrictions, implementers may consider not verifying the signature at all and only accepting ID Tokens with pairwise subject identifiers as hints.

ID Tokenの署名検証しないでPPIDをヒントとしてやりとりしたら良いじゃんとか言いだしています。うーむ。

ちなみに、このヒントについて、Privacy Considerationにも記載があります。 メアドや電話番号のような識別子を利用する場合はプライバシーに明らかに影響があるので、プライバシー要件が求められる場合は代替として以下のような識別子が利用できますねというあたりです。

  • PPIDを含むID Token(また出てきた)
  • ADからCDに転送された使い捨てID : 例えばCDであるPOS端末がADである手元のスマホに表示されているQRコードを読み取って決済開始!とかを想像するとどっかで聞いたことある気がします。
  • ディスカバリーサービス : 外のサービスで暗号化/復号みたいな

この辺りはCDというかClientが提供したいサービスの特性によってキメながら実装していく感じになりそうですね。

backchannel_client_notification_endpoint の扱い

  • OP は Client の管理下にあることを確認すべき
  • Push モードで Client が OP からトークンレスポンスを受け取った時、access_token, refresh_token, auth_req_id のハッシュの値をちゃんと検証する

OPがちゃんと実装してもClientの検証がぬるかったら大変なことになりますね。

ここまで仕様を見た感じの感想

  • CIBAの仕様で定義されている部分は実際に提供されるサービスの一部分(の裏側)に過ぎない
  • OP/Client間でどのモードを使うか、識別子の扱いなどキメが必要となる
  • モードによってはClientの開発環境のあたりで困るかも

というあたりでしょう。これに加えてOPはADのあたりもがっつり作らないといけない。しんどそうですね。

FAPI絡まなくても、既存のOIDCの仕組みが適用できないと思われていたところに使える面白い仕組みだと思うので、実サービスに組み込むには

  • ユースケース考えよう。オレオレ乱立を標準化するとメリット大きいものとは?
  • ユースケース毎にヒントのあたりをどうするかなど、ベストプラクティスを考えよう

みたいな取り組みができると良いのではないかと思いました。 OP実装の裏側にいる Authlete の人たちだけが頑張ってる場合じゃないですね。我々も頑張りましょう!(我々とは)

ではまた。

ファーストパーティーなアプリが使うOAuth/OIDCについてのお話 2019 春

夜分遅くに失礼いたします。ritouです。

こういう記事を読むとうずうずします。おそらく病気です。

terut.hatenablog.com

森羅万象を担当しているわけではないので、OAuth/OIDCが使えんのか?って観点から書いておきます。

ファーストパーティーのOAuth/OIDC利用

単一サービス内でOAuth/OIDC使うことってあるのか?という問いには「条件によっては適用可能」といったふわっとした答えになりそうです。フワッ

Webアプリ

Webアプリでも例えばドメインいっぱいある、別れている系でOAuth/OIDCでつなぐケースはありそうですね。

  • Microsoft : https://www.office.com/ -> https://login.microsoftonline.com/common/oauth2/authorize?client_id=... OAuth 2.0
  • Amazon : https://www.amazon.co.jp/ -> https://www.amazon.co.jp/ap/signin?openid.return_to=https%3A%2F%2Fwww.amazon.co.jp%2F OpenID 2.0!!!

当然、クロスドメインなセッションの確認方法、ログアウト時の処理など色々考慮する点は増えるかと思います。

Nativeアプリ

この辺りはあまり適当なことは書けませんが...要件としては「認証してリソースアクセスしたい」だと思います。 これを3つのステップに分割すると

  • Access Tokenを用いたリソースアクセス : 独自で作ったってどうせBearerっぽいのでやるんでしょう?
  • Access Tokenを払い出す機能
  • ユーザー認証機能

となり、主にユーザー認証とトークン払い出すところどうするんやというあたりでしょう。

  • NativeApp内でログイン画面を実装 : (サーバー側)独自のGrantTypeを作る、もしくは別Endpointとして各種トークンを払い出す機能を作る。WebAppがないNativeAppならこっちで良いかも?
  • 外部ブラウザ(相当のもの)を使う : (サーバー側)OAuth/OIDCのAuthorization Code Grant + PKCEとかで画面スキップ(後述)などUXをキメる。WebAppがあるならこっちの方がメリットあるかも

というあたりの選択になりそうですが、サービスの特性や今後の展開予定などにもよるのではないでしょうか。 サービスとしてNativeAppしかない場合に後者は厳しいでしょう。 例えば、最近のWebAuthnのようにWebAppの認証機能を作り込むといろんな環境でメリットがあるみたいな流れで行くと、後者もアリな気がします。

最近こんなの見かけたんですが、ファーストパーティーならこういう新しい仕組みも使えるかもしれません。

developers-jp.googleblog.com

Trusted Web Activity は、Android アプリ内で Chrome ブラウザを全画面で実行します。アプリ内に URL バーなどのブラウザの UI は表示されません。これは強力な機能なので、アプリとサイトが同じデベロッパーのものであること、すなわち「信頼できる」ことを検証しなければなりません。アプリと TWA で開いたサイトが同じデベロッパーのものであることを検証するために、TWA は Digital Asset Links を使って所有権を確認します。

まさにこれでは?期待ですね。

Resource Owner Password Credentials(ROPC)

ユーザーのCredentialを送ってTokenを取得するこの Grant Type ですが、認証機能付きの Access Token 払い出し機能ではありません。 そう思いたい気持ちはわからんでもないですが、ROPCでログイン機能作ろうと思うと、2段階認証とかどうしたら良いんや〜とかエラー表現〜とか色々思うところあると思います。あとログインだけあっても登録...ってなる。

ROPCは同じくユーザーのCredentialを預かってBasic認証API叩いてた系の仕組みに対して

  1. Basic認証からROPCにより一度Access Tokenに変換してやって保存し、リソースアクセスする仕組みに変える
  2. ユーザーのCredentialを受け取るのではなく、Authorozation Code などでAccess Tokenを取得する仕組みに変える

という手順をとってOAuthを使う仕組みに移行するためのものだと思いましょう。

同意画面のスキップについて

この辺りはコアな仕様の対象外かと思います。特定ユースケースに対するProfile系の仕様なら言及があるかもしれません。

同意画面の目的は "Clientがあなたに代わって(scope相当の)リソースアクセスをしようとしています。"という通知をして同意を得るためのものでしょう。 最近だとClient側のサービスの利用規約、プライバシーポリシーのリンクまで出すようにしてるとこもあると思います。

  • ファーストパーティー、セカンドパーティーならスキップ
  • ユーザーが「次回から表示しない」をチェックしたらスキップ
  • 同じclient,scopeで2回目以降ならスキップ

などなど、仕組みをOAuth/OIDCで作っておいて同意画面を飛ばすというやり方はずっと前からあるのでその辺はユーザーに説明できているかなどで判断すると良いかと思います。

理想としては、ファーストパーティーのアプリだとしてもAndroidのPermissionみたいな感じで例えばセンシティブな機能へのリソースアクセスを個別に拒否でき、拒否した機能を使いたくなったら再認可みたいな世界になってほしい気はします。と言い続けて10年ぐらい経ちました。

そこまでいかなくても、WebベースでやってきたサービスがNative Appを出しても「このアプリを使うとこんなデータが流れる!」みたいなのを気にする人もいるでしょうし、ファーストパーティーでもヘルプなり規約なりでどこかでちゃんと説明しておくってのは必要でしょう。

ザーッと書いてみました。寝かせるほどでもないのですぐに公開(投稿)しちゃいます。 深夜なので書き忘れてることがあったら後から追記します。 気になる点などありましたらコメントや言及してください。

そう言えば、昔のブログ(Y!ブログ)の記事を遡っていったら、自分は当初"ritou"を名乗っていなかったことがわかりました。いつから名乗り始めたのか記憶がない...

ではまた💤

DroidKaigi 2019 にて WebAuthn のお話をしてきました

こんばんは、ritouです。

こちらでお話してきました。

droidkaigi.jp

資料は話す前に上げました。

動画もあるみたいです(貼り方が控えめ)。スタッフさん仕事早いですね。

DroidKaigi 2019 - Chrome +WebAuthn で実現できるパスワードレスなユーザー認証体験と開発者の課題 / ritou [JA] - YouTube

去年の夏にも WebAuthn の紹介っぽい話を別のところでしたんですが、今回はUX的にも実感しやすい Android Chrome に引っ掛けて応募したところ採択された感じです。

終わった後にちょっとだけ質問をもらいましたが、「指紋とパターンロック解除あたりをもっと細かく制御できないのか」みたいなとこでした。 今年は基本的な仕様紹介のところからもう少し進めて、実際のUXや具体的な実装のところ(何ができる、何がAuthenticatorとかPlatformの裁量になるのか)の話を中心にしても聞いてもらえそうな感じがしました。

数少ない知り合いともお話できてありがたかったです。

ネタがあるうちにまた頑張りたいですね。 ではまた。

メアドなどのスクリーニング対策を意識しつつ WebAuthn のログインフローを考える

ritou です。

年末ですが、一年を振り返るエモいポエムを書く気はさらさらないのでいつも通りです。よろしくお願いします。

今年は WebAuthn が話題になりました。 来年はブラウザの対応も進み、本格的に導入してくるサービスも増えてくるかと思います。というか出てこい。というか出そう。

当然、今まで提供してきた認証方式から全てのユーザーを一気に切り替えることは不可能でしょう。 導入にあたってのポリシーはそれぞれだと思いますが、UserVerification を用いてパスワード認証からの完全移行を目指す、もしくはオプションや多要素認証として提供するにしても、既存の認証方式と組み合わせたログインフローを実装する必要があります。

今回は既に複数の認証方式をサポートしているサービスのログインフローをざっと振り返った後に、今年別件で話題になっていたメアドや電話番号などのスクリーニングへの対策という視点を入れてどのようなログインフローを実装すべきかを考えたというお話です。

いきなりまとめ

ダラダラと書いてますが、こんな流れです。

  • GやY!Jはユーザー識別後に設定されている認証方式を提供
  • microsoft はユーザー識別と並列で WebAuthn の認証機能を提供
  • WebAuthn でも Resident Key 使えない環境だと最初にユーザー識別が必要
  • ソーシャルログインも最初に IdP毎の分岐をするのが一般的
  • ユーザー識別後に処理を分岐させるとスクリーニング対策は困難
  • WebAuthn の認証フローでもスクリーニング対策は可能
  • 既存のログイン方法 or WebAuthn のように並列にしておくのが良さそう
  • 利便性低下の防止のために前回と同じ認証方式を使うみたいな仕組みを入れても良いかも

では始めます。

複数の認証方式を提供するサービスを見ていく

まずは Google, Yahoo! JAPAN, microsoftあたりを見てみましょう。

Google

(おそらく普通の) Google ユーザーは2種類の認証方式を利用できます。

ログインフローがどうなっているかを整理します。

まず、ログイン画面で存在しないユーザーのメアドを入れるとエラーになりますね。

f:id:ritou:20181231010133p:plain

Googleの場合、登録されているメアドというよりも 存在するgmailかどうか がここで判断できますね。

次に、「スマートフォンでログイン」を設定していない場合、ログイン画面でメアドを入れるとパスワード入力画面になります。

f:id:ritou:20181231010158p:plain

スマートフォンでログイン」を設定している場合、ログイン画面でメアドを入れるとスマホでタップしろ画面になります。

f:id:ritou:20181231010238p:plain

スマートフォンでログイン」を設定しているユーザーかどうかがここで判断できます。 ちなみに他の方法で...ってやると、こんな画面です。

f:id:ritou:20181231010304p:plain

これはまぁ、いいや。

ここまでで、利便性重視なんでしょうけれども、登録されているかどうか、スマホでログインする設定になってるかどうかがログイン試行している人物に対して丸わかりです。 次は WebAuthn にも対応している Y!J を見ていきましょう。

Yahoo! JAPAN

Yahoo! JAPAN も複数の認証方式に対応しています。

  • 確認コードでログイン(SMS)
  • 確認コードでログイン(メール)
  • 指紋・顔認証など(WebAuthn)

そして、Googleと同様にそれぞれわかりやすいUXとなっています(雑)

まずは存在しないメアドとかの場合。

f:id:ritou:20181231182246p:plain

あ、これ赤枠で囲ったわけじゃなくてログイン画面の背景が赤いんです。念のため。

次、確認コードでログイン(SMS)の場合

f:id:ritou:20181231022859p:plain

確認コードでログイン(メール)の場合

f:id:ritou:20181231022917p:plain

そして、Android Chrome + WebAuthn だとこんな感じです。

f:id:ritou:20181231023101j:plain

確認コードのところはなんかマスクしすぎてわけわかりませんが、Googleと同じような感じですね。 Google と Y!J では、「最初にユーザー識別をしてからそれに紐づく認証方法を提供している」と言えそうです。

次は、同じく WebAuthn のログインを実装している microsoft です。

microsoft

Windows 環境で microsoft + Edge を使うと、ログインに WebAuthn のフローを利用できます。

blog.haniyama.com

ログイン画面はこんな感じです。

f:id:ritou:20181231164906p:plain

"Sign in with Windows Hello or a security key" と言うリンクがここにありますね。 環境判定して Edge だけ出してそうです。 このフローを使うと、メアドなどを入力せずとも Windows Hello や セキュリティキーでログインできます。

f:id:ritou:20181231165437p:plain

navigator.credentials.get() 呼び出してそうです。

f:id:ritou:20181231165600p:plain

スクリーンショットをとった私の環境はPIN入れる画面ですが、とりあえずこれでログインできます。

microsoft の場合、「ユーザー識別をしてからそれに紐づく認証方法を提供 or WebAuthn」のような分岐になっているように見えます。

WebAuthn の Resident Key の現状

上記のように、microsoftWindows + Edge な環境では、「この時点で誰かわからないけどWebAuthnでログインさせる」と言う処理になっていました。 これは username-less とかとも言われますが、ResidentKey を用いた登録/認証機能です。

これは便利なので使いたいところですが、現状、全てのブラウザがこの Resident Key に対応できているわけではありません。 よって、早い段階で WebAuthn をサービスで利用しようと思った場合、Y!J のやっていたような一旦ユーザーを識別した後に紐づく公開鍵を用いて WebAuthn の認証フローに入っていく必要があります。

と言うことは、やはりG や Y!J のようなやり方がベストなのでしょうか?

ソーシャルログイン対応サービス

Google も Y!J も基本的に自分たちで認証機能を提供しています。 それに対し、世の中には既に「ソーシャルログインを利用」する形で複数の認証方式に対応しているサービスがたくさんあります。

例えば、エンジニア向けのイベントで有名な connpass とか

f:id:ritou:20181231170657p:plain

エンジニアの転職で有名なメルカリとか

f:id:ritou:20181231170643p:plain

ソーシャルログインを利用するログインフローでは、「パスワード認証 or ソーシャルログイン」もっと言うと「パスワード認証 or IdPその1でログイン or IdPその2でログイン or ...」と言う感じで、これまでの例でいうと microsoft のやり方に近いです。

ということで、ここまでで複数の認証方式をサポートしたログインフローを考える時の最初のキメは「ユーザーの識別前に認証方式を分岐させるか、識別して設定に合わせた認証方式を提供するか(さらにいうと、識別後に分岐させるか)」あたりかなと思ってきました。

少し落ち着いて、一旦スクリーニング対策について考えましょう。

スクリーニング対策の必要性

今年、メールアドレスなどのスクリーニングについての話題も目につきました。

qiita.com

よくある「メアド or パスワードが間違っています」でやってたところが、新規登録のところでちゃんとエラー返してたのでスクリーニングに利用されたのではというお話ですね。

今回はログインの話ですが、スクリーニングに使われることの何が嫌かというと

  • 悪意のある行為の手助けをしてしまう
  • 例えばSMSをじゃんじゃん送られたらそれなりにお金もかかる
  • 対象となり通知を受けたユーザーが困惑、心配からの炎上
  • 負荷も上がるかも

といったあたりでしょう。 やはり良いことなさそうです。

まぁ、GoogleGmailが生きてるかどうかを聞いてもそんなに得しない気もしますが、オンラインショッピングや決済関係のサービスでスクリーニングされたらそのリストの価値は上がるでしょう。

しかし、上記のGやY!Jのようにユーザー識別後に処理が分岐するようでは、簡単にスクリーニングされてしまうので、microsoft やソーシャルログインを利用するサービスのように、並列に WebAuthn の認証フローに入る、かつスクリーニング対策をする方向で考えていきたいところです。

WebAuthn におけるスクリーニング対策

こんな感じではどうでしょうか。

  1. 存在しないメアドや電話番号でも、認証画面に入る
  2. 公開鍵はメアドや電話番号に一意に紐づけられるダミーの物を用意しておく。毎回同じものを使う。
  3. 万が一認証通ってきたとしても、しれっとエラーにする

この辺りはもう少し考えたいですが、できないことはなさそうです。

既存の認証方式とWebAuthn の組み合わせ方案

ここまでの話を整理して、ログインフローを検討しました。

Step 1 : ログインフローの最初に分岐

例え現状の WebAuthn の認証フローがユーザー識別を必要としても、最初に分岐させるのが良さそう。 Y!J の認証方式の用語を用いるとこんな感じでしょう。

f:id:ritou:20181231030450p:plain

Step 2 : ユーザーに紐づくメアド or 電話番号などを入力

ここで登録されていないエラーは出しません。

Step 3 : 存在しないメアド or 電話番号の場合でもダミーの公開鍵で WebAuthn の認証フローに入る

仮にダミーの公開鍵だったとしても、WebAuthn の Authenticator から見たら「別の Authenticator 向けの公開鍵なんだな」として処理してくれれば問題なさそう。

スクリーニング対策による利便性低下への対策

上に書いたログインフローですが、ユーザー視点で毎回分岐しまくるのは正直辛いですし、エラーも出てこない分、永遠に「ログインできねーや」と詰む人が出てきそうです。 また、どんな認証方式を利用しているか忘れてしまうこともあるでしょう。

実は、ソーシャルログインの普及時期においても同様の議論はありました。 例えばソーシャルログインでサービスアイコンが並んでる時の問題は Nascar Problem と呼ばれていました。

idmlab.eidentity.jp

上記の記事にもありますが、この問題の対策として、前回利用した認証方式を覚えておくみたいな話があります。 WebAuthnが利用できる環境なら使うけど、そうじゃなかったらSMSとかで確認コードを送りたいみたいなユーザーにも、ブラウザごとに前回の認証方式が利用できる仕組みになっていると良さそうです。

まとめ

最初に書きました。

  • GやY!Jはユーザー識別後に設定されている認証方式を提供
  • microsoft はユーザー識別と並列で WebAuthn の認証機能を提供
  • WebAuthn でも Resident Key 使えない環境だと最初にユーザー識別が必要
  • ソーシャルログインも最初に IdP毎の分岐をするのが一般的
  • ユーザー識別後に処理を分岐させるとスクリーニング対策は困難
  • WebAuthn の認証フローでもスクリーニング対策は可能
  • 既存のログイン方法 or WebAuthn のように並列にしておくのが良さそう
  • 利便性低下の防止のために前回と同じ認証方式を使うみたいな仕組みを入れても良いかも

今回のお話ですが、現状の他のサービスを見つつ、優秀な若者氏に相談して見た結果、良さそうってなった提案です。 これでうまくいくかどうかはわかりませんので、実際に自分たちのサービスに導入して検証できると面白そうですね。

長文読んでいただきありがとうございました。来年も頑張りましょう。

ではまた!