結論からいうと
WebMockでHTTP通信をスタブしつつとSSLのOpenID認証を使う場合には次のようにWebMockを設定する必要がある:
WebMock.allow_net_connect!(net_http_connect_on_start: true)
どういうことかというと
ruby-openidはidentifierがSSL(https://から始まる)の場合に、事前に通信できるかどうかをチェックしてる。実装としてはこのあたり。
そしてそれはNet::HTTP#start
でNet::HTTP#connect
が呼ばれていることを前提としている。もし呼ばれていない場合には@socket
がセットされていないので、次のようなエラーが出る:
OpenID::DiscoveryFailure: Failed to fetch identity URL https://xxxxxx/ : Error fetching https://xxxxxx/: undefined method `io' for nil:NilClass
で、WebMockではREADMEにある通り、デフォルトだとNet::HTTP#start
を上書きしてconnect
を呼ばないようにしている。なので、WebMockをrequireしたままだとOpenIDの事前チェックに失敗してしまう。
というわけで、connect
を呼ぶようにするために前述のオプションが必要になる。
WebMock.allow_net_connect!(net_http_connect_on_start: true)
ちなみにomniauth-openidだと上の例外に対して次のようなシンプルなエラーログが吐かれるだけなのでちょっとわかりづらい。
ERROR -- omniauth: (some_provider) Authentication failure! connection_failed encountered.