SalesforceのWeb APIに対する意見

残念ながら個人的な意見なので殆どの人には響かないに違いないが、できるだけ一般の技術者にわかるように書く。なお実はそれほど現在の業務とは関係ない。

自分がやりたいこと

Salesforce(あるいはDatabase.com)のデータにアクセスするHTML5Ajaxアプリ(iPhone対応)を書きたい。なおVisualforceは管理者にセットアップさせるから×。外部サーバ経由は通信ポイントがいたずらに増えるから&IP制限してたときに使えないから×。直接API EndpointにJavaScriptから通信するのが一番よろしい。

現状

REST APICORS (Cross-Origin Resource Sharing) に対応してない。SOAP APIの方は(CORSではなくcrossdomain.xmlだが)OKしてるのになんでなのかまったくよくわからない。せっかくImplicit Grant (User-Agent flow) も対応してるのにほぼ意味ないじゃない。SOAP APIでやるにはFlash Proxyを経由するしか無いので、PCブラウザならいいが、Flashの動かないモバイル用途だとこれも×。え、PhoneGap?アプリじゃなくてWebじゃないとだめなんですよ。

結論

Patのブログのコメントを見るかぎりCORS対応はロードマップには入っているっぽいが、いつになるのかわからない。Winter '12では入らなかった。Spring '12で対応しなかったら見限ろうかと思う。CORS対応を見据えてのDatabase.comに対するよいしょ記事を用意する予定だったがもう書かない。拗ねる。お蔵入り。なので中の人は調べてこっそりいつ頃になるのか教えてくれるとありがたい。

補遺:想定問答集

「セキュリティのことを考えてあえてCORSはOFFにしてるのでは?」

⇒ セキュリティというのが「IPアドレスによるAPIのアクセス制御が難しいからクロスドメインでの直接アクセスを禁じたい」という主旨であるとして、それは現在Flashアプリが(AIRでなくWeb埋め込みでも)SOAP API経由でクロスドメインで直接APIコールが送れるようになっている実態と矛盾する。

「Herokuでやったらいいじゃない」

⇒ サーバを介することは不必要な通信ノードを増やす。クラウドとはいえサービス提供者が運用を気にする必要ができてしまい面倒。あとIPアドレス帯域の制限は結構よくある話なのでサービスの展開に影響する。ユーザの管理者に頼んで許可IPアドレスに入れてもらうくらいならVisualforceで作っても似たようなもん。

「PhoneGapでやったらいいじゃない」

⇒ PhoneGapだと結局iPhoneアプリ作って配布することになる。AppStore?エンタープライズ配布?それもいいが、そうじゃない選択肢としてHTML5はあるのだ。

「Visualforceで(以下同文)」

⇒ 管理者にセットアップ(インストール)してもらうようなことを想定したアプリ・サービスならそれでもよいが、そうでない、バイラル的・ボトムアップ的に利用者が広がるようなものについては提供が不可能。

「管理者が認めたアプリからしかアクセスさせない、のが普通では?」

⇒ もし本当に管理外のアプリからのアクセスを禁じたいなら、現状それは「アクセス可能なIPアドレス帯の制限」「ネットワーク内PC/スマートフォンへのインストールアプリの制限」などと同時に実施されなければ意味がない。前者はSalesforceの設定の話だが、後者はそれ以上の全社的な運用ポリシーの話になるので、徹底してやってるところは稀。あるいは「APIアクセスの禁止」も選択肢となりえるが、それは同時に認可したい他のアプリ/サービスからのアクセスも禁ずることになる。
さらに、先ほど述べたとおり、現状Flash Webアプリが直接APIコールできるため、単なるアプリケーションのインストール規制というのはそれほど意味をもたない。
なお、管理者による利用アプリを制限を真っ向から否定するほどラジカルな意見を持っているわけではない。ただ、それを実現するために、低レベルなレイヤーで境界を設けるのは時代遅れだと言いたい。実際 Chuck もそういう意見でしょ(参考:Cloud Identity Summit でのcmortのプレゼン資料

SalesforceのOAuth Implicit Grant (User-Agent flow) はAndroid/iOSアプリのためにあるのでは」

⇒ そうだとするなら、なぜOAuthクライアントの登録時に https:// ではじまるリダイレクトURIの登録を許しているのか。