CASのProxy機能のウォーク・スルー超訳
原文
- 作成:Andrew Petro
- 最終更新:Peter Chung Yan Thung on Feb 25, 2009
訳者断り書き
このドキュメントは「Proxy CAS Walkthrough( https://wiki.jasig.org/display/CAS/Proxy+CAS+Walkthrough )」の超訳です。
例によってTsubasaが私的に翻訳したものなので訳の正確さについては保証しません。
この訳文を使用した事による損害等について翻訳者は一切を免責させていただく事とさせていただきます。
翻訳文章についての質問、意見は原文や原文筆者に問い合わせる事はしないでください。
まえがき
CASのproxy ticketのウォーク・スルー(実際の例)です。
このウォーク・スルーはCASメーリングリストのDavid Spencerによって提供されました。
イントロ
CASを使ってproxyを行うアプリケーションの仕組みを理解しようとする時、手動でproxy ticketの発行の様子をなぞってみると理解の大きな助けになると思います。CAS Serverはこの働きの間においてサーバとして振る舞うと同時に、単純にWebブラウザにURLを作成して供給する事によって他の全ての役割 − ユーザ、proxyするアプリケーション、proxyされるアプリケーション − としても振る舞います。
ブラウザだけではできない流れの一部分については、CASが自身のproxyするアプリケーションへのコールバックを行う時はその部分のURLを慎重に手動作成しました。その為に、proxyコールバックURLにはログファイルやHTTPリクエストをscanできるマシン上のものを選びました。
ステップ1:ログイン
始めるにあたり、あるサービスに対してCASでログインします。
https://foo.bar.com/is/cas/login?service=http://localhost/bling
ログインに成功すると、CASはticketを付加して指定されたサービスへリダイレクトします。(サービスはURLの後ろにつけられたチケットとして構成され、アクセスできないURLとしてブラウザのロケーション・バーに表示されるかどうかは重要ではありません。)
http://localhost/bling?ticket=ST-956-Lyg0BdLkgdrBO9W17bXS
ステップ2
(a): チケットの確認とその完了
最初のアプリケーションとしての振る舞いで(この段階ではproxyするアプリケーションではなく − 単にアプリケーションがproxy無しで今認証されたという意味)、ticketを取得して、そこからユーザ名を取得する必要があります。
https://foo.bar.com/is/cas/serviceValidate?ticket=ST-956-Lyg0BdLkgdrBO9W17bXS&service=http://localhost/bling
これは以下のような応答を返します。
<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'> <cas:authenticationSuccess> <cas:user>endjs</cas:user> </cas:authenticationSuccess> </cas:serviceResponse>
これはノーマルな、他のアプリケーションへproxyしないアプリケーションの終わり方です。
(b) : チケットの検証とさらなるproxyの有効化
もし代わりに、他のアプリケーションへのproxyできることが必要な場合、CASがProxy Granting Ticketと共にコールバックする為の「pgtUrl」をvalidation要求に付加する必要があります。
ややこしい所ですが、特にあなたがサービスチケットは1回のみ有効なチケットである事を忘れ、それをserviceValidateで使ってしまった場合、CASに戻って、新しいチケットを得取得しなくてはなりません。(ステップ2の(a)を完了した場合、ステップ2の(b)を行う前にもう一度ステップ1を行う必要があります。)
HTTPSのurlであることが必要であるのを除いて、ここのpgtUrlの選択はかなり任意です、そして、それはあなたがログファイルにアクセスできるサーバにある必要があります。
https://foo.bar.com/is/cas/serviceValidate?ticket=ST-956-Lyg0BdLkgdrBO9W17bXS&service=http://localhost/bling&pgtUrl=https://foo.bar.com/pgtCallback
結果は、
<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'> <cas:authenticationSuccess> <cas:user>endjs</cas:user> <cas:proxyGrantingTicket>PGTIOU-85-8PFx8qipjkWYDbuBbNJ1roVu4yeb9WJIRdngg7fzl523Eti2td</cas:proxyGrantingTicket> </cas:authenticationSuccess> </cas:serviceResponse>
のようになります。
ステップ3:PGTを掘り出す
この時点で、最初のアプリケーションはユーザが誰であり、Proxy Granting Ticket IOUを持っている事を知っています。本当のPGTはfoo.bar.comのapacheのアクセスログ内に出力されており、CASがPGTを渡す為に行ったレスポンスを探し出すことができます。
foo.bar.com - - [10/Dec/2003:09:28:15 +0000] "GET /pgtCallback?pgtIou=PGTIOU-85-8PFx8qipjkWYDbuBbNJ1roVu4yeb9WJIRdngg7fzl523Eti2td &pgtId=PGT-330-CSdUc5fCBz3g8KDDiSgO5osXfLMj9sRDAI0xDLg7jPn8gZaDqS HTTP/1.1" 200 13079
(作者注:改行はページの見栄えの為に入れました。)
ステップ4: proxy ticketの取得
PGTについて、把握している限り、proxyしたい他のサービスのproxy ticketを取得する為にCASをコールできます。
https://foo.bar.com/is/cas/proxy?targetService=http://localhost/bongo&pgt=PGT-330-CSdUc5fCBz3g8KDDiSgO5osXfLMj9sRDAI0xDLg7jPn8gZaDqS
応答は、
<cas:serviceResponse> <cas:proxySuccess> <cas:proxyTicket>PT-957-ZuucXqTZ1YcJw81T3dxf</cas:proxyTicket> </cas:proxySuccess> </cas:serviceResponse>
のようになります。
ステップ5:proxy ticketの検証
proxyされるアプリケーションとしてのこの一連の最後のロールです。proxyするアプリケーションはサービスURLを呼び出され、proxy ticketが渡されます。
チケットを受け取り、検証をして、ユーザ情報とproxyチェーン上のアプリケーションを取得します。
https://foo.bar.com/is/cas/proxyValidate?service=http://localhost/bongo&ticket=PT-957-ZuucXqTZ1YcJw81T3dxf
応答は、
<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'> <cas:authenticationSuccess> <cas:user>endjs</cas:user> <cas:proxies> <cas:proxy>https://foo.bar.com/pgtCallback</cas:proxy> </cas:proxies> </cas:authenticationSuccess> </cas:serviceResponse>
明らかに、このウォーク・スルーはアプリケーションの為の良いproxyコードを発行やプラグイン化する為には役に立たないかもしれませんが、proxyするコードがどのような事を求めて何をされているのかの外観を見る事を助ける事によって貴方自身のコード開発の助けになると思います。
Originally provided by: David Spencer on the CAS mailing list.
ページコメント(原文にあったページコメント)
2006/10/03 : Matt Zukowski
Thanks! 全部理解できたよ。
2010/05/07 : Jonathan Markow
Fredrik Norrströmからのメールでのコメント:
いずれにせよ素晴らしい完成したドキュメントだ。
Proxy Granting ticketをCASサーバに渡す為のリクエスト前に(例えば、pgtIouやpgtIdパラメータ付きの)、サーバは「200 Ok success」を期待する何もパラメータの無い追加のリクエストを行う。しかしパラメータは何もついていない。django-casでCASプロキシチケットサポートを実行するとき、私はこれによって噛み付かれました。
proxy callback URLへのリクエストはサーバが検証可能な、全ての必要性を満たした証明チェーンのSSL証明によって保護されている場合だけ行われることを明言するのが良いでしょう。サーバがサーバ証明書を検証できなかった場合、proxy callback URLへのリクエストは行われず、その事はCASサーバのlogファイルにしか記録されません。
このコメントを読んだ権限を持つ誰かがドキュメントを修正してくれる事を望みます。
よろしく。
Fredrik
2010/07/18 : Shouvik Bardhan
この説明は大変助かります。しかし、CASとSpringのインテグレーションは私に目まいを起こさせると言わなければなりません。proxyアプリケーション(SpringによってCAS連携が有効になっている)から私はproxy ticketをこのように取得する事ができます。(Java BTW)
String proxyTicket = authToken.getAssertion().getPrincipal().getProxyTicketFor(testResource);
チケットは「PT-XXXX」ではなく「ST-XXXX」でした。(CAS3的にはOKなようですが)
私はtestResourceとして「"https://host:port/myAppB/j_spring_cas_security_check」(仮のURLですが)を使いました。
そして、proxy ticketを得られましたが、困っています。
上記のURL(私の環境に合わせたもの)でproxyValidateを行って、成功のXML応答をCAS Serverから得ることができました。
しかし、Java HTTPClientのコード(proxyするアプリケーションが持っているもの)でこのticketをmyAppB(proxyされるアプリケーション)でどうやっても使う事ができません。
そこで"testResourceURI + "?ticket=" + proxyTicket + "&spring-security-redirect=https://host:port/myAppB/index.html"をHttpClientのGETメソッドのURLとして使ってみましたが、それも動きません。もっとも考えられる事はmyAppB(proxyされるアプリケーション)のSpring/CASの設定が正しくないという事です。しかしどこが間違っているのか示す事ができません。
多分近くまで来てはいるのでしょうが、何かが最後に足りないような気がします。
2010/07/20 13:11 : Shouvik Bardhan
うーん、動いたね。myAppBのspring securityとjasig clientで使っているセキュリティー関係のXMLの試行錯誤をしました。
以下は私が行った設定の関係する部分だけの抜粋です。
原文の投稿者に改めて感謝します。このような素晴らしい文章無しでは私はここまでできなかったでしょう。
<bean id="casProcessingFilter"> <sec:custom-filter after="CAS_PROCESSING_FILTER"/> <property name="authenticationManager" ref="authenticationManager"/> <property name="authenticationFailureUrl" value="/cas_failed.jsp"/> <property name="defaultTargetUrl" value="/"/> <property name="proxyGrantingTicketStorage" ref="proxyGrantingTicketStorage"/> <property name="proxyReceptorUrl" value="/proxy/receptor"/> </bean> <bean id="casProcessingFilterEntryPoint"> <property name="loginUrl" value="[https://h\:p/cas/login"/\|https://h\:p/cas/login"/|]> <property name="serviceProperties" ref="serviceProperties"/> </bean> <bean id="casAuthenticationProvider"> <sec:custom-authentication-provider /> <property name="userDetailsService" ref="userService"/> <property name="serviceProperties" ref="serviceProperties"/> <property name="ticketValidator"> <bean class="org.jasig.cas.client.validation.Cas20ProxyTicketValidator"> <constructor-arg index="0" value="[https://h\:p/cas"/|]> <property name="acceptAnyProxy" value="true"/> </bean> </property> <property name="key" value="WebAppB"/> </bean>
訳文履歴
- 2010/07/21 -- 訳文初版公開
- Re: - Zenadin (2012年03月27日 07時00分09秒)
I reockn you are quite dead on with that.