RubyでProxyサーバ経由でのOpenIDアクセス

OpenID学習中である。(なかなか時間が取れずにはかどらない・・)
先日ruby-openidのサンプルを立ち上げて動かしてみたところだが、1点問題にぶち当たっていた。

会社(Firewallの中でHTTPアクセスはプロキシ経由が前提)の中に立ち上げたOpenIDサンプル実装(OP,RP実装を含む)を使って
色々遊ぼうと思ったのだが、さっぱり遊べない

というべきだろうか。そんな問題である。
あまりにつまらないので、自宅サーバを登場させてそちらにサンプル実装を乗っけたところちゃんと遊べたので、設定ミスではないらしい。

OpenIDってリダイレクトでブラウザを介してポンポン飛ぶだけだから中と外を意識しなくても使えるのかなぁ

なんて思っていたのだが、そうじゃないらしいということだ。

会社の中と外をまたがるOpenIDの使い方として2つ考えられる。即ち

    1. 社内のOP、オープンなRP
    2. 社内のRP、オープンなOP

である。このうち前者はだめっぽいが、後者はうまくいきそうだということがわかったというのが、本稿の趣旨である。
いや、本当に前者がダメなのか良くわからないが、ruby-openidのサンプルRPの実装を追っていると、YADISドキュメントを取得するという目的のため、RPから思いっきりHTTPリクエストを出しているので、たぶんダメっぽいと思う次第だ。

ここから本題(RubyProxyサーバ経由でのOpenID OPアクセス)

上記で「プライベートなRP、グローバルなOP」はできるっぽいと書いたが、実は普通にruby-openidのRPサンプルを動かしていると、以下のようなエラーが出て動かない。

ちっちゃくて見えづらいと思うが、要するに、

    • localhost:3001(会社のPC)でRPを動かして、
    • 自宅サーバに立てたOPにアクセスし、
    • Failed to fetch Identity URLと怒られている

という状況だ。原因はRPからOPへのHTTPリクエストがデフォルトではプロキシ経由にはならないから。

ソースを追っかけた結果、サンプルのconsumer_controllerに以下のような変更(環境変数セットして、OpenID.fetcher_use_env_http_proxyを呼ぶ)を加えたところ、

  def start
    # 以下2行を追加 ##
    ENV['http_proxy']="http://proxy.server.example.com:8080"
    OpenID.fetcher_use_env_http_proxy
    ###################

    begin
      oidreq = consumer.begin(params[:openid_identifier])
    rescue OpenID::OpenIDError => e
      flash[:error] = "Discovery failed for #{params[:openid_identifier]}: #{e}"
      redirect_to :action => 'index'
      return
    end
    ... 略 ... 
  end 

ちゃんと動いてくれた。

ちっちゃくて見えづらいと思うが、要するに、

    • localhost:3001(会社のPC)でRPを動かして、
    • 自宅サーバに立てたOPにアクセスし、
    • Verification Succeeded となった

という状況である。

環境変数セットするだけじゃダメで、OpenID.fetcher_use_env_http_proxyを呼ぶことがポイントってことでしょうかねぇ。
#と、以上、ぐだぐだ書いてみましたが、おそらくドキュメントにのってるんだろうなぁ。

しかし、社内にOpenID RPなサービスなんてまだろくに立っていないので、「社内に立てたOpenIDサンプルで遊ぶ」という当初の目的は達成できていません。(笑)