Shogo's Blog

Nov 24, 2012 - 4 minute read - Comments - Android Twitter

OAuthの認証にWebViewを使うのはやめよう

AndroidからTwitterへアクセスするためのライブラリとして,Twitter4Jが有名です. これを使ってみようと,「Android Twitter4J」と検索すると 認証にWebViewを使った例がたくさん出てきます.

・・・いや,ちょっとまて. それはちょっとまずいだろう.

そういうわけでもうちょっと賢い方法を探してみました.

何がまずいのさ

「Android Twitter4J」と検索すると,上位にこんなページが出てきます.

上のサイトでは次の様は方法をとっています.

  • アプリ内にWebViewを貼り付け
  • WebViewでTwitterの認証画面を表示
  • onPageStarted や onPageFinished をオーバーライドして callback URL へのアクセスを検出
  • URL に入っている認証コードで認証

アプリ内でWebViewを使うとURLが表示されません. つまり ** 本当にツイッターにアクセスしているかわからない ** のです. もし,表示されるのが偽の認証画面だったら,アプリから簡単にパスワードがわかってしまいます.

じゃあ,URL を表示させればいいかというとそういうわけでもありません. 画面上のURL表示なんて簡単に偽装できてしまいます. どんな工夫をしても ** アプリがパスワードの要求をしていることには変わりありません ** . アプリはパスワードを簡単に取得できます.

アプリのユーザはTwitterに限らずSNSへのログイン時にブラウザを開かないアプリは信用しないようにしましょう. どこかでパスワードの抜かれている可能性があります. (ただし,公式アプリは除く.公式アプリが信用できないならそもそもサービスを利用できないもんね.)

じゃあどうするのさ

じゃあ,開発者はどうするのかって話ですが,もう少し詳しく検索してみましょう. 他の方法を使っているページもでてきます.

PIN コードを利用

一つ目の方法はPC版クライアントでよく使われる方法. 認証後にPINコードと呼ばれる数字が表示されるので,それをアプリに入力します. twiccaなんかでも使われてますね. Twitter へのアプリケーション登録のときにコールバックURLを入力しないとこの認証方式になります.

認証画面に,ブラウザを開くボタン,PINコードの入力ボックス,ログインボタンを用意しておきます.

``` xml activity_oauth.xml <?xml version=“1.0” encoding=“utf-8”?>

<Button
    android:id="@+id/button_start_login"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Twitterへアクセス" />