今ずっとSalesforceと連携するシステムを扱ってるのですが、テストフェーズでハマって苦労したエラーを備忘として書いておきます。
連携はSalesforceが提供する標準APIベース(今回はRESTでなくSOAP使ってます)なのですが、頂いた話としては、権限とか色々大変なので、連携専用ユーザを作って処理する、というものでした。
ログイン判定自体はOAuth使ってログイン者基準なのですが、それ以降の連携通信では専用ユーザ、という少し特殊な形です。
で、疎通試験とかを終えて、業務系のテストが始まったとき、あちこちで不安定に連携が失敗する、という現象に陥りました。
エラーは「INVALID_SESSION_ID」というもので、ググると英語で色々出てきます。
WSDLが変とか、一度ログインしたあとSession IDをもう一度セットしないといけない、とかようわからん雑多な情報が転がってて、特定に苦労しました。
で、普通に日本語で以下の情報を発見。
https://help.salesforce.com/apex/HTViewSolution?id=000205994&language=ja
同一ユーザ名で複数のツールや端末からログインをした場合には同じセッションが割り当てられます。
そのため、いずれかのセッションがログアウトした事により、共有されているセッションが無効化され Invalid session ID found エラーが発生します。
な、なんだってー。
要するにSalesforceでは、一般的なWebのCookieベースなセッションとは異なり、サーバサイドでセッションIDを管理してるとのこと。
あとはご想像の通りで、今回、連携専用ユーザをベースにしているため、通常のWebのセッション単位にSalesforceのログインコネクションが張られて連携します。で、連携システムのログアウト時に、そのシステムのWebセッション破棄にあわせて、Salesforceもログアウト処理をかましていたのです。
そのログアウトがトリガーになって、別端末であっても、同じ連携専用ユーザで同じSalesforce Session IDを持ってる人がいるので死んでしまうという…。
原因がわかってしまえば、全員死んじゃう系の典型的な駄目パターンじゃん、って感じですが、Salesforceに詳しいわけでもない中、請け負っているのがね…。
ということで、連携専用ユーザのコネクションはシングルトンな形にして、基本ログアウトさせない形で何とか乗り越えました。気を付けないと、そのコネクションもセッションタイムアウトするケースがあると思うので、もう少し検討が必要な気もしますが。。。