Tech

Claudeのログイン画面やログインフローを雑に紐解いてみる

はじめに

身近な所でここマジックリングのログインだよね、いやなんかコード入れたよ、という会話が発生して気になったので見てみました。色々とよくできているなぁとなってしまい参考になりそうという意味で紹介してみます。

基本リスペクトベースの考察記事となっております。簡単に調べてわかる範囲のためセキュリティ影響は薄い認識ですが、削除したほうが良ければ連絡を頂き次第速やかに削除致します。

ログイン画面の構造

https://claude.ai/loginhttps://claude.ai/login

このログイン画面で面白いのは一般にはログイン要素しかない印象がありますが、Learn moreという下スクロールできる表示が表示されており、下にスクロールするとプランごとの説明やFAQが閲覧でき、LPと繋がっているような構造になっています。

claude-signin-screen.gif

適当なURLが共有された場合に受け取った人はユーザーでない場合はログイン画面にリダイレクトされがちですが、そういうユースケースでもサービスの魅力や特徴を伝えられるようにLPへシームレスに繋がるというのはすごい構造だなと感心しました。

本家Pricingは https://www.anthropic.com/pricing ですが、このページのpricingは https://claude.ai/login#pricing となっており、少し見た目も違うので別の実装ではありそうです。コンテンツはほぼ一緒ですが…。

Continue with Emailを押すと送信完了表示が表示されます。

claude-after-login-button.png

その後数秒立つと認証コード入力のUIに変わります。(ちょっと早い)

claude-after-login-button-delayed.png

ログインボタンを押した時のAPI処理

ログインボタンを押すと POST /api/auth/send_magic_link に対してリクエストが送信されます。

request payload

{
  "source": "claude",
  "login_intent": null,
  "email_address": "dummy@example.com",
  "recaptcha_token": "dummy",
  "recaptcha_site_key": "dummy",
  "utc_offset": -540
}

GoogleのRECAPTCHAが使われていますね。その他後で登場しますが、メール送信時にユーザーのローカル時間を知るためにutc_offsetをこの時点で送信しているようです。

response body

{
  "fallback_code_configuration": {
    "charset": "numeric",
    "length": 6,
    "show_input_after_delay": 5
  },
  "sent": true,
  "sso_url": null
}

ここで何秒後にUIが変わるかや認証コード入力の仕様が動的に設定できそうな感じになってますね。

Set-Cookie

pendingLogin=true; Domain=.claude.ai; expires=Tue, 05 Nov 2024 13:57:05 GMT; HttpOnly; Path=/; SameSite=lax; Secure

1時間有効期限のシンプルな値のCookieをセットしていますね。これはあとから出てきますが、このブラウザからログインフローを踏んだという記録を残していると思われます。有効期限が思ったより長く値もシンプルなのでhttponly, samesite=lax, secureで厳密に改ざん等が防げるということでしょうか。自分であればなんだか怖くて別の仕組みも合わせて入れたくなってしまいそうです。

cf-cache-status や x-cloud-trace-context のresponse headerがあるのでCloudflareのCDN系からオリジンはGCP系サービスに繋がっている可能性が高そうです。

ちなみにログイン画面自体は x-powered-by: Next.js があるのでわざわざ偽装していなければNext.jsを使っていてこちらも前段にCloudflareがいそうです。

メール

上記のAPIが実行されると下記のメールが届きます。

タイトル: Secure link to log in to Claude.ai | 2024-11-05 21:57:05
本文: マジックリンク入りのメール マジックリンク: https://claude.ai/magic-link#1234:asdf
*1234, asdf部分はそれぞれもっと長い英数字です。

この日時表記が日本時間で送られてきたのですが、これはログインリクエスト時にutc_offsetをブラウザ側から送ることによってローカル時間による時刻表現を簡単に実現しているように見えます。賢い…。

また、同じタイトルで送ってしまうとメーラーによって中身が部分的に返信扱いになってしまったりするのですが、常に違うタイトルにすることによって常にスレッド判定にならず防げそうです。また、ユーザーにいつリクエストしたかも示せるという一石二鳥な実装になっています。返信の回避は意図していないおまけかもしれませんが…。

マジックリンクの値部分は恐らくですが:区切りで2つの値が送られてきているので署名か復号用のiv等の値かもしれません。流石に素人すぎて分かりません。

メールを開く

ログインしたブラウザでそのまま開く

マジックリンクに遷移して恐らくCookieの値の確認を行いログイン後の画面に遷移します。 Cookieが切れている場合、というより実際リンクの有効期限切れということなのかもしれませんが、リンクの有効期限切れという画面になりました。

claude-link-expired.png

匿名ウィンドウで開く

匿名ウィンドウで開いた場合は画面にVerification Codeが表示され、ログインボタンを押した後の入力欄で入力することでログインできます。

claude-verification-code.png

おわりに

ログインしたブラウザと同じブラウザでメールを開けたユーザーに対してはそのままログインするという快適なUXを提供しつつ、なんとなくスマホ(別ブラウザ)で開いた人にも迷わずにログインできるUXをCookieを上手く活用しながら実現しているのが面白いですね。

結構文言の1語1語も上手いなと個人的には思ってしまうのでいいログインフローだなと思ってしまいました。あっぱれでございます。

それではまた!

share