ラベル OAuth の投稿を表示しています。 すべての投稿を表示
ラベル OAuth の投稿を表示しています。 すべての投稿を表示

2010年5月15日土曜日

[OAuth] 携帯でTwitterのOAuthを無理やりやってみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
2011-07-04追記: 今はTwitterのOAuth画面もガラケー対応されてます。自動でリダイレクトはされないのでユーザによるクリックは相変わらず必要ですが。

モバイルフォースクエアの開発初期に、OAuthでTwitterの認証をやろうとしていた時に試した結果です。手元にあったAU,docomoの端末で確認しています。

AU(W61CA)でTwitterのOAuthをやってみた

ログイン画面 承認画面
特に問題なし! 自動でリダイレクトはされないが、リンクを手動でクリックすれば動作はOK!

docomo Cookie対応機種(N-07A)でTwitterのOAuthをやってみた

ログイン画面 承認画面
文字化けがひどいが、ID・パスワード欄っぽいところに入れて1つ目のボタン(ログイン)を押せば承認画面に飛ぶ。 自動でリダイレクトはされないが、リンクを手動でクリックすれば動作はOK!

docomo Cookie非対応機種(SH704i)でTwitterのOAuthをやってみた

ログイン画面 承認画面
両方とも送信ボタン…。1つ目を押せば承認画面に飛ぶ。 文字化けがひどいが、リンクを手動でクリックすれば動作はOK!

まとめ

 docomoだと文字化けがひどいが、OAuthの機能的には動作する。ただし最後のリダイレクトを手動でクリックしないといけないのでユーザにこれを強いるのは難しい。
※実際、OAuth開始前の画面に注意書きを入れたにもかかわらず、最後のリダイレクトのクリックが分からず、トークンが取得できていないユーザ多数いた
 PIN入力方式にすればよいが、PC・スマートフォンでも同じコンシューマキーを使いたいので、PC・スマートフォンでのユーザビリティが落ちるので却下。PCでOAuth認証だけ先にさせるのも携帯のみのユーザのことを考えると却下。
→結果、xAuthを使うことにした。

[OAuth] 携帯でfoursquareのOAuthを無理やりやってみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
モバイルフォースクエアの開発初期に、OAuthでfoursquareの認証をやろうとしていた時に試した結果です。手元にあったAU,docomoの端末で確認しています。

AU(W61CA)でfoursquareのOAuthをやってみた

ログイン画面 承認画面
日本語文字化け… 文字化け&Denyが押せないが、動作はOK!

docomo Cookie対応機種(N-07A)でfoursquareのOAuthをやってみた

ログイン画面 承認画面


デザインは崩れるが、動作はOK! デザインは崩れるが、動作はOK!

docomo Cookie非対応機種(SH704i)でfoursquareのOAuthをやってみた

ログイン画面→表示が崩れ、ログインボタンを押しても同じ画面が繰り返し表示されるだけ…。
※当時はログインできていた記憶が…、サーバ側の実装が変わったかもしれないです


まとめ

Cookie対応機なら文字化けしたりデザインは崩れるが、OAuthの処理自体は正常。文字化けがひどい状態ではサービス提供できないので、foursquareの中の人に日本の携帯ブラウザ事情を説明し、Auth Exchange採用。

2010年2月11日木曜日

[Scala] ScalaでOAuth

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
lift-oauthはサーバ側(サービスプロバイダ)とのことなので、Scalaで使えるOAuthライブラリを探してみた。dispatchに含まれてることが分かったので、早速試してみるが、演算子オーバーロード(*1)やらimplicit defやら使いまくりで非常に難解…。(*1: Scalaでは識別子に記号が使えるので演算子オーバーロードってのはホントは正しくない)

Specsのテストコード(dispatch/oauth/src/test/scala/OAuthSpec.scala)が一番良いサンプルだったので抜粋してコード読解。
import org.specs._

object OAuthSpec extends Specification {
  import dispatch._
  import oauth._
  import OAuth._
  
  val svc = :/("term.ie") / "oauth" / "example" // *1, *2
  val consumer = Consumer("key", "secret") // *3
  
  "OAuth test host" should {
    "echo parameters from protected service" in {
      val h = new Http
      val request_token = h(svc / "request_token.php" <@ consumer as_token) // *4, *5, *6
      val access_token = h(svc / "access_token" <@ (consumer, request_token) as_token)
      val payload = Map("identité" -> "caché", "identity" -> "hidden", "アイデンティティー" -> "秘密", 
        "pita" -> "-._~")
      h(
        svc / "echo_api.php" <<? payload <@ (consumer, access_token) >% { { // *7
          _ must_== (payload)
        }
      )
    }
  }
}

  1. :/ はobject。:/() == :/.apply() メソッドで、dispatch.Requestを返す。(http://っぽいから:/にしたと思われ)
  2. / はRequestクラスのメソッド。パスをつなげて新しいRequestを返す。
  3. OAuthのコンシューマ・キー、コンシューマ・シークレットを保持するケースクラス。
  4. Http.apply()メソッドにRequestインスタンスを渡してHTTPリクエストを投げている。
  5. <@ はRequestSignerクラスのメソッド。Requestクラスをコンシューマ・シークレットで署名したりする。Request → RequestSignerはimplicit defされているのでそのまま呼べる。
  6. as_token はHttp.apply()の第2引数として渡されるハンドラ。レスポンスのbodyに含まれるトークンをTokenインスタンスにして返す。
  7. <<? はRequestクラスのメソッドで、クエリ文字列を付加した新しいRequestを返す。

参考文献など: