Xのアプリ承認と
「ログイン中のアカウント」

先日、外部サービスとXアカウントとの連携について質問がありました。

<svg class="eyecatch-svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 192 192">
  <!-- 背景 -->
  <rect width="192" height="192" rx="32" ry="32" fill="white" />
  
  <!-- シールド本体 -->
  <g transform="translate(96, 96)">
    <!-- シールドの形状 -->
    <path d="M 0,-60 L 45,-45 L 45,15 C 45,40 30,55 0,70 C -30,55 -45,40 -45,15 L -45,-45 Z" fill="#2196F3" stroke="#1976D2" stroke-width="3" stroke-linejoin="round" />
    
    <!-- シールド内側のハイライト -->
    <path d="M 0,-55 L 40,-41 L 40,15 C 40,37 27,50 0,63 C -27,50 -40,37 -40,15 L -40,-41 Z" fill="#42A5F5" />
    
    <!-- Xロゴ(簡略化) -->
    <g transform="translate(0, -5)">
      <path d="M -18,-15 L -8,-15 L 0,0 L 8,-15 L 18,-15 L 5,5 L 20,25 L 10,25 L 0,10 L -10,25 L -20,25 L -5,5 Z" fill="white" />
    </g>
    
    <!-- チェックマーク(承認) -->
    <g transform="translate(25, -35)">
      <circle cx="0" cy="0" r="14" fill="#4CAF50" />
      <path d="M -5,0 L -2,5 L 6,-6" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" fill="none" />
    </g>
  </g>
  
  <!-- 下部の装飾ライン(セッション接続を表現) -->
  <g transform="translate(96, 150)">
    <circle cx="-30" cy="0" r="4" fill="#607D8B" />
    <circle cx="0" cy="0" r="4" fill="#607D8B" />
    <circle cx="30" cy="0" r="4" fill="#607D8B" />
    <line x1="-30" y1="0" x2="30" y2="0" stroke="#E0E0E0" stroke-width="2" />
  </g>
</svg>Xのアプリ承認と<br class="chiilabo-br is-on">「ログイン中のアカウント」

インターネットを見ていたら、「〜にアカウントへのアクセスを許可しますか?」という表示がありました。画面の右上には現在ログイン中のアカウント名が表示されているので、そのアカウントで承認されることはわかります。

ただ、実は私、もう一つ別のXアカウントを持っているのですが、そちらは古いメールアドレスで登録していて、パスワードも忘れてしまい、今はログインできない状態なんです。ボタンを押した後で「もしかして、画面をよく見ていなくて、ログインできない方のアカウントで承認してしまったのでは?」と不安になりました。

そもそも、「ログインできないアカウントでアプリ承認はできない」と考えてよいですか?

関連記事

1. 結論:ログインできないアカウントでは承認できない

「アプリを承認」するには、ブラウザでXにログインしている必要があります。

パスワードを忘れたなどで現在ログインできないアカウントは、そもそもブラウザでログイン操作ができません。過去にアカウントを作成したとしても、いまログインできなければセッションも作られないのです。

したがって、そのアカウントのセッション状態で「アプリを承認」することも不可能、ということなります。意図せずに過去に作ったアカウントがアプリ連携してしまう心配はないわけです。

2. セッション状態:ログイン中を記録しているもの

ここで理解しておきたいのが、ブラウザやアプリの「セッション」という仕組みです。

セッション状態とは ブラウザ Cookie (セッション情報) ログイン中 ログイン済みという証明 セッションはアプリごとに記録される パスワード記憶とは別物

ブラウザでXにログインすると、そのブラウザには「今、どのアカウントでログインしているか」という情報が保存されます。これを「セッション状態」と呼びます。
つまり、「セッション(Session)」とは、簡単に言えば「ユーザーがサービスにログインしてから、ログアウトするまでの一連の期間・状態」のことです。この情報は、スマホ単位ではなく、ブラウザやアプリ内に記録されます。

このセッション情報は、ログアウトするか一定時間が経過するまで保持され続けます。
だから、一度ログインすれば、しばらくはページを移動しても「ログイン状態」が維持されるわけです。

つまり、ブラウザは常に「今はこのアカウントでログイン中だよ」という情報を持っているんですね。

2.1. なぜセッションが必要か

ここで重要なのは、セッションはパスワードそのものの記憶とは異なります。
つまり、「パスワードマネージャ機能」とは別物だということです。

セッションとパスワード記憶は別物 Webページは本来 誰が見ても同じ(ステートレス) 各ページは独立 切り替えるごとに 毎回ログインが必要だと不便 セッション 状態を維持(一時的) パスワード記憶 入力を省略(永続的)
  • セッション:
    一度ログインした後、その状態を維持するための仕組み
  • パスワードマネージャ:
    次回ログイン時に入力を省略するための機能

ログイン時に使うのがパスワードマネージャ機能で、ログイン中であることを維持するのがセッション情報です。

そもそも、Webの仕組みは本来「ステートレス」でした。
つまり、1回1回のページ表示は独立していて、前のページで何をしたか覚えていません

でも、それだとページを移動するたびにログインし直さなければならなくなってしまいます。
そこで「セッション」という仕組みで、「この人はログイン済み」という状態を維持しているんです。

3. 「アプリを承認」画面とセッション

では、外部サービスとXを連携する際の「アプリを承認」画面は、どのように表示されているのでしょうか。

アプリ承認とセッションの仕組み セッション状態 ブラウザがログイン中の アカウントを記憶 承認の流れ 1 外部サイトがXに問合せ 2 Xがセッション確認 3 ログイン中なら 承認画面を表示 4 ログインしていないなら ログイン画面を表示 画面表示時点で確定済み ログイン状態による違い ログイン可 アプリ承認 できる ログイン不可 アプリ承認 できない 承認できた = その時ログイン中だったアカウント

実は、この画面が表示されるまでには、次のような流れがあります。

  1. 連携したい外部サービス(アプリ)が、Xに対して「このユーザーのアクセス権限を確認したい」と問い合わせます。
  2. Xは、ブラウザのセッション情報を確認します。「このブラウザは、今どのアカウントでログインしているんだろう?」という確認ですね。
  3. もしすでにログイン中であれば、そのログイン中のアカウント情報をもとに「アプリを承認」画面を表示します。
  4. 逆に、ログインしていなければ、先にログインボタンが表示されます。
3. 「アプリを承認」画面とセッション

つまり、「アプリを承認」画面に到達した時点で、既にどのアカウントでログインしているかが確定しているんです。

4. 【補足】Xと連携済みアプリを確認する

ちなみに、現在ログインしているアカウントであれば、実際に連携しているアプリを確認することができます。

  1. Xにログイン
  2. 設定を開く
  3. 「セキュリティとアカウントアクセス」→「アプリとセッション」を選択
  4. 連携しているアプリの一覧が表示されます

ここに該当のアプリが表示されていれば、そのアカウントで承認済みということです。逆に表示されていなければ、そのアカウントでは承認していないことがわかります。

セッション状態という仕組みを理解すると、アプリ連携のときにどのアカウントが選ばれているのかがわかります。必ず、その時点でログインしているアカウントでしか承認できないようになっているんですね。