passport/expressのサーバとOIDCプロバイダーの間にProxyを通す

インターネットへのアクセスにプロキシが必要な社内ネットに、Webサーバを立てて、Auth Code FlowでOIDCの認証を利用しようとすると、 Webサーバ(OIDCのクライアント)とOIDCプロバイダーの間にもProxyを通しておく必要がある。

例えば、expressでAzureADのOIDC認証を利用しようとすると、passportおよびpassport-adでOIDCの認証を利用できるのだが、 expressとかpassportが裏で行うOIDCプロバイダーへのアクセスにもproxyを通す必要がある。

しかし、いわば勝手に通信をしてしまうので、直接プロキシを通しずらいという問題がある。

そこで、global-agentというのを試した。 ほかにもいくつかあったが、簡単に使えてWeekly Downloadがまぁまぁ多かったのが採用の理由。

使い方は、公式に書いてある通りなのだが、一応メモしておく。 他の使い方は公式を参照のこと。

  1. global-agentを追加する。

sh yarn add global-agent

  1. GLOBAL_AGENT_を頭につけたプロキシの環境変数を設定しておく。
export GLOBAL_AGEMT_HTTP_PROXY=$HTTP_PROXY
export GLOBAL_AGEMT_HTTPS_PROXY=$HTTPS_PROXY
export GLOBAL_AGEMT_NO_PROXY=$NO_PROXY
  1. 起動するコードに以下のimportを追加しておく。
import 'global-agent/bootstrap';

global-agentによってnodejsのhttpまたはhttpsモジュールの接続をproxyを介するようになる。 passportをはじめとする、大体のモジュールはhttp/httpsモジュールを使って通信をしている。

なので、Azure ADのOIDC認証も、プロキシを越えて利用できるようなるということ。