freeeのデータをLightning Connect経由でSalesforceタブに表示する

## 外部データソース（External Data Source）について

Winter '15から External Data Source（外部データソース）機能がGAとなり Developer Edition で利用できるようになりました。マーケティングネームとしてLightning Connectと呼ばれていたりしますが、Apple製のデバイスに刺す[あいつ](http://store.apple.com/jp/product/MD818ZM/A/lightning-usb%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB)のことではありません。

外部データソースとは、Salesforceの外部のサービスをあたかもSalesforce内のオブジェクトであるかのように扱える便利な機能なのですが、今のところ２つの課題があります。1つ目は、接続できる外部サービスはSalesforceからリーチできる場所（＝クラウド上）にある必要があるということで、2つ目は、サービスが[OData](http://www.odata.org/)というちょっと馴染みの薄いエンタープライジー（？）なプロトコルに対応している必要があるということです。

## 外部データソースとファイアーウォール越え

1つ目の課題については、[セキュアエージェント](https://help.salesforce.com/HTViewHelpDoc?id=external_secure_agent.htm)という機能がいずれそれを解決してくれる模様です。セキュアエージェントとは、Salesforceからファイアーウォール内のデータソースにアクセスできるように、ファイアーウォール内に置くブリッジプログラムのことです。内部ではおそらくWebSocket/Cometのような形で通信路を確保することで、クラウドからの逆向きのリクエストを処理できるようになっているのではないかと思います。現在は残念ながらSharePointデータソースのファイル検索にしか対応していない模様ですが、いずれ任意の外部データソースに対してもブリッジしてくれるようになるのではないかと思います。

もしそれが待てないなら、3rd Partyのソリューションを使うという手もあります。[DataDirect Cloud](https://www.progress.com/products/datadirect-cloud)は、ファイアーウォール内のOn−Premiseデータベースに接続するブリッジソフトウェアとクラウド上のODataプロキシがセットになったサービスです。Salesforceの外部データソース経由の接続については[こちら](http://www.odata.org/blog/salesforce-external-object-integration-using-lightning-connect-with-odata/)に記事があります。

## OData と Apex Connector Framework

もうひとつの課題、現在はODataプロトコルに対応する必要があるという点ですが、こちらについてはODataでなくとも [Apex Connector Framework](http://www.slideshare.net/developerforce/df13-using-external-objects-for-integration-mt) というものを用いれば対応できるとのことです（現在はパイロットプログラムのみ）。しかしながら、Apexですべて賄うのは何かと面倒な上、そもそも外部データソースでは認証プロバイダ経由で自動的にアクセス管理をしてくれるのが良い点なので、そこをカスタムでやらなければいけないのであれば魅力が半減してしまいます。


## OData プロキシと freee API

サービスがODataプロトコルが話せないのであれば、強制的に話せるようにしてしまえばいいのでしょう。ここで、Heroku上にOData変換プロキシを設けてやることで、通常のOAuth保護されたREST APIを持つサービスにアクセスできないだろうかと考えました。せっかくなので、連携のニーズの多そうなクラウドベースの会計ソフトである[freee](http://www.freee.co.jp/) のAPIを題材にしてみます。

ちなみにfreeeのAPIは[こちら](https://secure.freee.co.jp/developers/api/doc)に説明があります。OAuth2に対応しています。


## 認証プロバイダの登録

Salesforceには、認証プロバイダという外部のアイデンティティプロバイダにログインを委ねられる機能があります。FacebookやSalesforceだけでなく、OpenID Connectに対応したプロバイダについても扱えるようになっています。さらにSpring '14からOpenID Connectプロバイダでなくとも、任意のOAuth 2.0プロバイダに対しても接続できるようになりました。こちらに関しては以前書いた[こちらの記事](http://qiita.com/stomita/items/02d56607f81cb6b3fa23)をご参照下さい。

freee APIにアクセスする際にも、この認証プロバイダの機能を活用することになります。freeeのAPIコンシューマキー・シークレットの取得は、freeeにログインした上で[こちら](https://secure.freee.co.jp/oauth/applications)から登録できます。

## 外部データソースの設定

認証プロバイダを作成したら、External Data Sourceを登録します。種別は「プラットフォーム接続: OData 2.0」に設定する必要があります。サービスURLには、freeeのAPI Endpointではなく、以降に説明するHeroku上のODataプロキシのURLを指定します。

ID種別としてユーザを選び、認証プロトコルはOAuth、そして認証プロバイダには先ほど作成した「freee」を設定します。

![Google ChromeScreenSnapz154.png](https://qiita-image-store.s3.amazonaws.com/0/6495/bd34441d-11a6-6e48-8b5a-e9151400e33d.png)


## Heroku上のODataプロキシ実装

今回はNode.js+Expressでプロキシを書いています。freee APIの deals (取引（収入／支出）) の情報を取得するだけの、もっとも最小限のプログラムのみを記述することにします。

External Data Sourceでは、接続時に`<External Data SourceのサーバURL>/$metadata` に対して、このサービスが持つテーブル情報のメタデータをリクエストしてきますので、埋め込みのXMLを返しています。この中には`Deal`テーブルとそのスキーマ情報が記載されています。

次に`<External Data SourceのサーバURL>/Deal`エンドポイントを用意します。こちらでSalesforceからfreeeのOAuthトークン情報を受け取り、その上でfreee APIのdealsリソースの情報をリクエストし、返ってくるJSONを前述のODataスキーマ情報に合わせて変換します。

## 外部オブジェクトの作成とタブの追加

あとは、External Data Source 内のDealテーブルを表示する外部オブジェクトを作成し、それをタブ化してあげれば大丈夫です。

その結果はこちらです。

![Google ChromeScreenSnapz159.png](https://qiita-image-store.s3.amazonaws.com/0/6495/633880bb-8850-5725-73e9-cd26048049c3.png)


...あれれ？


## お詫び

理論的にはこれでうまくいくとおもってたんですけど、なんかいろいろできてないみたいです。
もう時間切れですすいません、見積り誤りました。
結果についてはいずれアップデートします。
ソースもちゃんとうまく行ったら公開しますので、勘弁して下さい...

※ このエントリはSalesforce1 Advent Calendar 2014に参加することになっていました。