2012-02-02 (木)
*OAuth2.0とか
http://www.thread-safe.com/2012/01/problem-with-oauth-for-authentication.html
会社で話題になったのでOAuth2.0について少し調べてみた.
http://tools.ietf.org/html/draft-ietf-oauth-v2-23
読むとWebアプリケーションからAPI呼ぶためのaccess_tokenを取得するのに使えそうな方法として「Authorization Code Grant」と「Implicit Grant」というのがある.
記事で問題になっているのは,Implicitの方.ブラウザにaccess_tokenが渡されるので,他のクライアント(サイト)で取得されたトークンとすりかえることができる.
たとえば,アリスが運営するサイトが,Implicitでユーザー認証もどきをやっていて,ボブがそのサイトを利用している場合を考える.イブは攻撃者.
- イブは無害そうな内容の罠サイトを作って待ち構える
- ボブが罠サイトにOAuthでログインする
- イブはaccess_tokenを取得できる
- イブがaccess_tokenをアリスのサイトに渡す
- イブはボブとしてサイトにアクセスできる
つまり,パスワードを渡さない(一見)安全そうなOAuthなのに,パスワードを複数サイトで共有するのとまったく同じ危険性がある.そもそも,ユーザー認証に使える仕組みでは無いので,使ってはいけない.
もう一方の,Authorization Codeはブラウザ経由で渡されたauthorization codeをクライアント情報と一緒に渡すので,他のクライアントが取得したcodeは使えない.
FacebookのOAuthインターフェイスがAuthorization Codeに対応してるのか良くわからないですが,Authorization Code使えということでいいのかな.