OAuthにおけるカスタムURIスキームの使いどころ

夏にSocialWeb Conference vol.6ってのでちょっとだけ「カスタムURIスキーム」ってキーワードを出しました。
ただ、そんなに詳しくは話していなかったと思うので、ここで残しておきます。

カスタムURIスキーム って何よ?

iPhoneアプリAndroidアプリ系の開発をしたことがある人は知ってる方多いと思いますが、httpとかFTPとかじゃなくてアプリが勝手に作った文字列って感じですかね?
正式な定義を知っている方がいれば教えていただきたいところなのですが、とりあえず私はIANAに登録されているもの以外のものとして考えています。

PHPで配列にマッチングさせてIANAに登録されているやつか判定する方法も考えてみたりとか。https://github.com/ritou/php-IANAUriSchemes

カスタムURIスキームをOAuthに使うことのメリット

OAuth 1.0aでは、ブラウザで認○処理を完了した後に以下の2つの方法しかありません。

  • oauth_verifierパラメータつきでoauth_callbackに戻す
  • oauth_callbackに"oob"を指定することでブラウザを戻さず、oauth_verifierを手動入力などでつなぐ

これけっこう不便ですよね。以下のようなパターンを実装しようと思うと、oob+手動入力にするしかありません。

そこで、カスタムURIスキームを用いてアプリケーションを立ち上げつつoauth_verifierパラメータも渡せたら幸せなんじゃないですか?って話です。

  • ブラウザから非ブラウザのアプリケーションを立ち上げることができる

って感じですね。

ちなみに、OAuth 2.0では1.0aの"oob"を使ったケースの部分を最初はDevice Profileとか言って、途中でCoreから外れたっぽいです。
なので、この部分の話は解決したわけではなく、OAuth 2.0へと続く話でもあるわけです。

カスタムURIを用いてアプリケーションを立ち上げるサンプル

今回は、OAuthではないもののいくつかのアプリケーションをブラウザから立ち上げるサンプルを見てもらうことで上記の話を体験していただければと思います。
利用立ち上げるアプリケーションは私の家のPCに入っていたこいつらにします。

Skypeでもできそうでしたが誰かに電話かけようとするのでやめときました。
iPhoneアプリ関連だとこのあたりが参考になりそうですね。
サンプルはこちらにアクセスしてみてください。

ローカルPCにY!メッセンジャーが入っててログアウト状態だったりする場合、立ちあがってきませんか?
少々警告画面っぽいのがでるかもしれませんが、ほとんどのブラウザがこの書き方で動作しました。
今回はJavaScriptでHTML描画の最後に普通のURLと同じように飛ばしています。

iPhoneとかAndroid,iPadとかで動くかわかりませんが、このへんをうまく使えばUXの良いアプリが出てくるのかなと思っています。

ちょっとハマったブラウザ互換

リダイレクトにHTTP Headerによる指定を行ったところ、ブラウザによってかなり挙動が変わっていたような気がしました。
なんとか立ち上げるもの、そもそもエラーになっちゃうものなど。

実際に使っている例

とりあえず、iPhoneFlickrのアプリがこんな感じでブラウザからアプリに戻る部分を実装していた気がします。

課題?というか自分で考えて悩んだこと

  • 例えばConsumerKey(ClientID)登録/発行時にCustom URI Schemeを入力させたときに、正しいのかどうかわからない

他のアプリのデータを消去するパスとか、自分にコンタクト要求をさせるパラメータとかをcallbackに指定されたりするリスクがありそうです。
Skype + OAuthとみせかけておかしな電話番号に発信させられたら、ユーザーもSPも困ってしまいます。
この辺を考慮して、どっかのSPは対応しているけどパートナーOnlyだとかっていう話も聞いた(というか言った)ことがあります。。。

それでは今日はこの辺で。
前回のOpenID/OAuthのログアウト連携についてのエントリが微妙な反応をもらったので、別の案とかも出そうかなと思います。