GoogleのQRコードログインのしくみを勝手に想像する

こんばんは、ritouです。

GoogleQRコードを用いたログインを実装していたという記事を見つけました。

この機能について勝手にしくみを想像し、問題と解決案を提案します。

概要

上記リンクにも説明があります。

  1. 未ログイン状態のブラウザで、QRコードを表示するURLにアクセスする
  2. 表示されたURLをiPhone/Android/BrackBerryのバーコードリーダーアプリで読み込む。iPhone/Android/BrackBerryでブラウザを起動してそのURLを開く
  3. その画面からGmailまたはiGoogleをはじめるボタンをクリックする
  4. QRコードが表示されていたブラウザがいつのまにかログイン状態になっている

こんな感じで、ブラウザ側に一切Email/PWを入力せずにログインが可能になるというしくみです。
しかし、1/17 22時時点ではこんな文言が表示されて何もできなくなりました。

Hi there - thanks for your interest in our phone-based login experiment.
While we have concluded this particular experiment, we constantly experiment with new and more secure authentication mechanisms.

Stay tuned for something even better!

Dirk Balfanz, Google Security Team.

phone-based login experimentと呼ばれるらしいですね。
ここからは昼間に試した記憶を頼りに進めます。

何が行われているか

それでは、どんなことが行われているのかを想像します。

  1. QRコードを表示するURLは、サーバー側からのPush通知を待つ(もしくはサーバー側にポーリング処理を行う)
  2. QRコードには、なんらかの識別子が含まれる
  3. ユーザーが同意すると、QRコードを特定する識別子とユーザー情報がサーバーに送られる
  4. サーバーがその識別子にマッチするブラウザにユーザー情報を含んだPush通知を送る or ブラウザ側からの通信にユーザー情報を含んだレスポンスを返し、ログイン状態になる

厳密なシーケンスではないですが、図にしてみました。

こういうフロー、どこかで見たことがあります。

OAuth 1.0

長くなる気配なので、結論からいきます。これは、
「信頼の置けないブラウザ上でEmail/PWを入力させずに済むようにSmartphoneによるOAuth 1.0を自サービスに適用したしくみ」と言えます。

GoogleにログインするだけなのにOAuth、しかも1.0なんて何を言ってるんだと思われるかもしれませんが、ちょっと見方を変えてみましょう。
ブラウザを一昔前のTVだと思ってください。文字入力できるけどブラウザ積んでるわけではない場合を想像してください。

  1. TV画面にQRコードが表示される(ServerからRequst Tokenを取得してURLに含む)
  2. ケータイのカメラでQRコードを読み込む。ケータイのブラウザが立ち上がる
  3. OAuthの同意画面で同意する。ついでにPINを表示される。(Request TokenにUser情報が紐づく)
  4. PINを入力すると、TV画面でログイン状態になっている(Request TokenからAccess Tokenを取得、紐づいたユーザー情報を取得してログイン状態にできる)

PINについて気になってるかもしれませんが、後で説明するので待っててください。
2009年12月にYahoo! JAPANのTech Blogでこんな記事がありました。
モバイル版OAuthの便利な活用方法 - Yahoo! JAPAN Tech Blog
たいたいここにある例と同じですよね。

ただし、TVの例に出てくるPIN入力が存在しません。
これは、2009年4月に脆弱性が発覚したOAuth 1.0の仕様とほぼ同じです。
PINを持たないこの実装では、QRコードを他人に読ませてStartリンクを押させることで手元のブラウザを他人のアカウントでログイン状態にすることが可能です。OAuth 1.0の問題についての過去エントリを書いていました。OAuth Security Issue - r-weblife

手順は増えてしまうけどOAuth 1.0a仕様にすれば実用的かも

上記のとおりリスクがあるわけなので、私がG社の社員であれば1.0a仕様にアップグレードすることを提案します。
PC Browser : QRコード表示と同時に、PIN入力欄を表示
Smartphone : Start with Gmailをクリックした後に、PINを表示してユーザーのPC Browserに入力させる
というのはいかがでしょうか?

OAuth 2.0の仕様しか知らない人は、PC BrowserがClient, "PIN"をAuthorization Codeと読み替えてAuthorization Code Flowをやるってことだと覚えてください。
いずれにしろ、このような使い方で旅先や公共のPCでキーロガーなどを防ぐ方法は個人的にはアリだと思います。このphone-based loginの今後に注目です。

「いえーい G社員 見てるー?」

ではまた。