既存の認証インフラストラクチャがある CF 展開シナリオを調査しており、ログインを既存の SSO 機関に委任するように UAA を構成する必要があります。最初のステップとして、login.rb サンプル サーバーを使用することにしました。
サンプルの login.rb とサンプル アプリを localhost で実行し、UAA インスタンスを別のホストで実行して環境をセットアップしました。アプリから localhost:3000 のログイン ページへのリダイレクトは機能しており、ログを見ると、login.rb サンプルが UAA への投稿を行っているときに (パススルー) 認証が成功していることがわかります。許可するためにポストに受け取った応答も 200 OK を返します....必要なプロンプト文字列を含む JSON が返されていることがわかります。ただし、erb 確認ダイアログで問題が発生します。login.rb の 124 行目で例外が発生します。
NoMethodError - undefined method `[]' for nil:NilClass:
/home/fieldj1/Documents/workspace-sts-3.1.0.RELEASE/uaa/samples/login/login.rb:124:in `block in <class:LoginApplication>'
/var/lib/gems/1.9.1/gems/sinatra-1.3.2/lib/sinatra/base.rb:1212:in `call'
/var/lib/gems/1.9.1/gems/sinatra-1.3.2/lib/sinatra/base.rb:1212:in `block in compile!'
/var/lib/gems/1.9.1/gems/sinatra-1.3.2/lib/sinatra/base.rb:785:in `[]'
/var/lib/gems/1.9.1/gems/sinatra-1.3.2/lib/sinatra/base.rb:785:in `block (3 levels) in route!'
/var/lib/gems/1.9.1/gems/sinatra-1.3.2/lib/sinatra/base.rb:801:in `route_eval'
...
問題は、UAA からの JSON OAUTH 応答を解析するコードが古くなっていることです。これから124行目を変更して修正しました:
erb :confirm, :locals => {:client_id => confirmation_info["authorizationRequest" ["clientId"], \
:scopes => confirmation_info["authorizationRequest"]["scope"]}
これに:
erb :confirm, :locals => {:client_id => confirmation_info["auth_request"]["authorizationParameters"]["client_id"], \
:scopes => confirmation_info["auth_request"]["authorizationParameters"]["scope"]}
他の誰かがこれを見たことがありますか?UAA 全体の git clone を行ったので、実行しているコードは一貫性があるはずだと確信しています。私の環境が何らかの形で矛盾しているのか、それとも本当の問題を見つけたのかはわかりません。
ありがとう、ジョン