Dancing with Heroku AppLink / 2
(ローカルアプリと組み合わせる...?)
構成の概要
Heroku AppLinkの活用例として、こんな構成を試してみた。

- 個別に作成したElectronアプリケーションがあって、そのアプリケーションはSalesforceのデータを参照したり、データを作成する。
- Electronアプリケーションに、Salesforceのアクセストークンを持たせてアクセスできるようにしたい。
- しかし、Electronアプリケーション内にSalesforceのアカウント情報を持たせたくないし、個別のログイン機能なんて作りたくない。
- Electronアプリケーションに渡す情報にはSalesforce外の情報もあり、その諸々の情報をまとめるためにHerokuアプリケーションを設置した。
- (Apexコードを書くのがやや面倒...)
といったあたりで、上のような構成を試してみた。
Heroku AppLinkの活用ポイント など
※主に②で大活躍するので、そこに絞った話をしてみよう。
まず、Heroku側の実装としては以下を前提として、Node.jsアプリケーションを構築する。
- Heroku AppLinkをAdd onに追加する
- Heroku AppLink Service Meshをビルドパックに追加する
- Webアプリケーションフレームワークはお好きなもので
- fastify, Express など
そして、Salesforceからのリクエストを受け付けるエンドポイントを実装して、Salesforceにインポート(OpenAPIに沿って記述したyamlを取り込む)する。
そうすると、動的Apexとしてインポートされるので、Flowから呼び出すことも可能になる。
Salesforceからリクエストする(②)と、Heroku Router => Service Mesh => Herokuアプリケーションという順番でリクエストが流れてくる。
Service MeshではSalesforceの認証情報が含まれているか検証して、認証情報がなければエラーとしてHeroku Routerに返す。つまり、Herokuアプリケーションまでリクエストが届かないこととなる。
したがって、認証情報を持たないリクエスト(≒ Salesforce外からのリクエスト)は除外される、ということだ。
Herokuアプリケーション側に独自の認証機構を実装せずに済むのは、非常に楽と言える。
そして、Herokuアプリケーションは③の時点では、Salesforceの認証情報を持っている状態でゴニョゴニョできる。
Salesforceの認証情報のほかに、必要な情報をペイロードに持たせてJWTを返す、みたいなことも可能になる。
その他
⑤では、Electronアプリケーションを起動するためのディープリンクを返すのだが、Electronアプリケーションに登録したカスタムスキームを指定して数式項目やSalesforceが用意するタグを使用することはできない。
※Salesforceでは外部アプリケーションを起動するスキームとして https, mailtoといった標準的なものだけに限定している。
VisualforceページもしくはLightning Web Componentを作って、<a>タグで埋め込む必要がある。