[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[upki-fed:00622] Re: NetCommonsのシボレス化



折原様、学認の皆様

 お世話になっております。
 都医学研の赤沢です。

 結論から申し上げればダメでした。皆様のご参考には
 なりませんがご報告させていただきます。

 今回は 年度内にNetCommonsを動作させるという要請もあり、
 SSOはやめておきます。NetCommonsを (ADではなく)LDAP
 認証するような改造ができることはわかっており、これで
 よしとしておきます。

 どうもありがとうございました。

======================= ご報告 ======================
 $app_cookies = $http->getResponseCookies();
 で得られる、$app_cookies の中身を見てましたところ
 false (Boolean型)でした。
 # print_r($app_cookies); では画面に何も表示されませんでしたので
 # var_dump($app_cookies); で確認しました。

 PEARのHTTP_Requestの説明によれば、falseが返ってくると
 いうことはcookieが無いということだと書いてありました。
http://pear.php.net/package/HTTP_Request/docs/latest/HTTP_Request/HTTP_Request.html#methodgetResponseCookies

 「ログインプロキシ」アプリケーションは、
 https://sptest.igakuken.or.jp/login/index.php
 として配置し、webブラウザでアクセスしてみました。
 その/login/index.php は次のような中身としました。
------------------------------------------------------------------
<?php
  require_once "HTTP/Request.php";

//  if(!$_ENV['eduPersonTargetedID']){
  if(!$_SERVER['eppn']){
    // eduPersonTargetedID が存在しない場合は認証エラー
    header("HTTP/1.1 403 Forbidden");
    echo "<h1>Too bad!</h1>\n";
    echo "<div>'eppn' was not found...</div>\n";
    exit;
  }

  $http =& new HTTP_Request("https://sptest.igakuken.or.jp/htdocs");
  $http->setMethod(HTTP_REQUEST_METHOD_POST);
//  $http->addPostData("user_id", "shibboleth_user");
//  $http->addPostData("password", "shibboleth_password");
  $http->addPostData("login_id", "sampleuser");
  $http->addPostData("password", "**********");
  $app_response = $http->sendRequest();
  $app_cookies = $http->getResponseCookies();

echo '<h3>$app_response: ';
 var_dump($app_response);
 echo "---</h3>\n";
echo '<h3>$app_cookies: ';
var_dump($app_cookies);
echo "</h3>\n";
exit;
------------------------------------------------------------------

https://sptest.igakuken.or.jp/htdocs は、NetCommonsのログイン
ページです。POSTする箇所の引数として何を与えるべきかがよく理解
できていませんが、次のふたつを試しました。どちらの結果も、
$app_cookiesにはfalseがセットされました。

----- 学認サイトに載っているサンプルコードのまま -----
  $http->addPostData("user_id", "shibboleth_user");
  $http->addPostData("password", "shibboleth_password");

----- NetCommonsのログインページの inputタグのname属性値を
   採用し、かつ、NetCommonsにローカルに存在するユーザ名と
   パスワードをPOSTしてみた
  $http->addPostData("login_id", "sampleuser");
  $http->addPostData("password", "**********");

SP(NetCommons)の /etc/httpd/conf.d/shib.conf は次のように
ログインプロキシにアクセスすると Shibboleth認証するように
設定してあります。
>> -----------------------------------------
>> <Location /login>
>>    AuthType shibboleth
>>    ShibRequestSetting requireSession true
>>    require valid-user
>> </Location>
>>#以下の設定は不要そうなので行頭に#を付与してコメントアウト
>>#<Location /htdocs>
>>#    AuthType shibboleth
>>#    ShibRequestSetting requireSession true
>>#    require valid-user
>># </Location>
>> -----------------------------------------

なお、
$app_response = $http->sendRequest();
の行は、true (boolean型)が返ってきておりますので
HTTPリクエスト自体は送信できているようです。


> 東京都医学総合研究所 赤沢様
> 
> 北見工業大学の折原と申します。
> お世話になっております。
> 
> 私も同じサイトを参考にシステムを構築しましたが、
> 本学の環境と参考サイトの環境では$app_cookiesの構造が
> 異なっていました。
> 
> $app_cookiesにどのような値が入っているかを
> 確認してみると良いかもしれません。
> 
> $app_cookiesの内容はcookieをセットする場所で
> 以下の処理を実行すると確認できると思います。
> ※ この処理はログインを中断しますので確認後は削除してください
> 
> print("<PRE>\n");
> print_r($app_cookies);
> print("</PRE>\n");
> exit;
> 
> 
> なお、本学の環境では以下の処理でcookieをセットできます。
> 
> foreach($app_cookies as $cookie){
>    setrawcookie($cookie["name"], $cookie["value"], $cookie["expires"],
>      $cookie["path"], $cookie["domain"], $cookie["secure"]);
> }
> 
> 
> 参考になれば幸いです。
> 
> 
>> UPKI-FEDのみなさま
>>
>>  いつもお世話になっております。
>>  都医学研の赤沢です。
>>
>>  テストフェデレーションに参加中で、テスト用IdPとテスト用SPを
>>  構築し、両者間の連携(※)もうまくいきました。
>>
>>   ★学認サイトの「1.SPにテスト用のWebページを準備」に
>>    従って、「属性確認用の簡単なPHPプログラム」を利用
>>    させていただきました。
>>    https://www.gakunin.jp/docs/fed/technical/sp/customize/sp-test2
>>
>>  ここで、NetCommonsをシボレス化しようとしているのですが、
>>  うまくいっておりません。たびたびで恐縮ですがお知恵を拝借
>>  できますでしょうか。
>>
>>   ※ご存じの方も多いかと思いますが、NetCommonsはオープンソースの
>>    CMS兼グループウェアです。
>>    http://www.netcommons.org/
>>
>> [1] 当方の環境
>>
>>   (1) テスト用IdP(以下、IdPといいます)
>>      OS: CentOS 5.5
>>      Apache: 2.2.3
>>      PHP: 5.2.10
>>      jdk-6u37-linux-i586-rpm.bin
>>      tomcat 6
>>      shibboleth-identityprovider-2.3.8
>>   ※学認サイトの「技術ガイド」に従って構築しました。
>>
>>   (2) テスト用SP(以下、SPといいます)兼NetCommonsサーバ
>>      OS: CentOS 5.9
>>      Apache: 2.2.3
>>      PHP: 5.3.3
>>      PHP PEAR: 1.4.9
>>      MySQL: 5.0.95
>>      NetCommons: 2.4.0.0
>>      Shibboleth: 2.5.1
>>   ※SPは学認サイトの「技術ガイド」に従って構築しました。
>>
>>  蛇足ですが、両サーバともこの連休中はシャットダウンして
>>  あります。この週末停電があるためです。
>>
>>
>> [2] NetCommons
>>
>>  https://sptest.igakuken.or.jp/htdocs/ にてアクセスできる
>>  ようにしてあります。NetCommonsのローカルユーザを作成し
>>  ローカル認証でログインできることも確認済みです。
>>
>>  また、このローカルユーザは 当方のLDAPにも登録済みです。
>>  LDAP と NetCommonsで二重のユーザ管理となりますが、
>>  ここは妥協しています。
>>
>>  クッキー名は session_cookie となるようにNetCommonsを
>>  設定済みです。
>>
>> [3] SPのシボレス化の方式
>>
>>  https://www.gakunin.jp/docs/fed/technical/sp/WebApp
>>  ↑の「2.既存のアプリケーションのユーザ管理へのProxyを用意する」
>>  に従いました。
>>
>>   ※「3. Shibbolethのセッションをもとにユーザ管理を行う」を
>>    最初に試しましたが、これはうまくいきませんでした。
>>    詳しくはNetCommons2公式サイトに書いておきました(ご参考)。
>>    http://www.netcommons.org/bb7war9c0-4093/#_4093
>>    この方法は興味があったので試したのですが、本採用するには
>>    問題がありました。例えば、NetCommonsのユーザ権限や所属ルーム
>>    を当方のLDAPで新たに管理する必要があるといったことで、
>>    導入負荷が高すぎると考えています。
>>
>>
>> [4] ログインProxy
>>
>>  ログインProxy用プログラムを /login/index.php として用意しました。
>>  index.php としては、学認サイトの次のページに記載の「PHPのサンプル」
>>  を利用しました。
>>  https://www.gakunin.jp/docs/fed/technical/sp/WebApp/pattern2
>>
>>  ただし、次の箇所は当方の環境に合わせて変更しました。
>>  (変更後のものをお示しします)
>>
>> <?php
>>  (中略)
>>    $http =& new HTTP_Request("https://sptest.igakuken.or.jp/login");
>>    $http->setMethod(HTTP_REQUEST_METHOD_POST);
>>    $http->addPostData("login_id", "shibboleth_user");   ←☆1
>>    $http->addPostData("password", "shibboleth_password"); ←☆2
>>    $app_response = $http->sendRequest();
>>    $app_cookies = $http->getResponseCookies();
>>
>>    // 取得されたアプリケーションのセッションCookieをレスポンスに設定する
>>    setcookie('session_cookie', $app_cookies["session_cookie"], 0, "/",
>> "sptest.igakuken.or.jp");
>>
>>    // ログイン後のトップページへリダイレクトする
>>    header("HTTP/1.1 302 Found");
>>    header("Location: https://sptest.igakuken.or.jp/htdocs");
>> ?>
>>
>>   ☆1 NetCommonsのオリジナルのログイン画面で、ユーザ名の
>>      <input>タグでは 属性name="login_id" となっています。
>>   ☆2 同じく、パスワード入力用の <input>タグでは 属性
>>      name="password" となっています。
>>
>>
>> [5] SPの設定
>>
>>  /etc/httpd/conf.d/shib.conf に次の設定を追加しました。
>> -----------------------------------------
>> <Location /login>
>>    AuthType shibboleth
>>    ShibRequestSetting requireSession true
>>    require valid-user
>> </Location>
>>
>> <Location /htdocs>
>>    AuthType shibboleth
>>    ShibRequestSetting requireSession true
>>    require valid-user
>> </Location>
>> -----------------------------------------
>>
>>  続いて、
>>  service shibd restart
>>  service httpd restart
>>  を実行しました。
>>
>> [6] うまくいく点
>>
>>  https://sptest.igakuken.or.jp/login/ にアクセスすると
>>  学認のDSにリダイレクトされ、当方のIdPを選択後、当方のIdPに
>>  リダイレクトされます。ユーザ名とパスワードを入力すると
>>  https://sptest.igakuken.or.jp/login/ に戻ってきます。
>>
>> [7] うまくいかない点、試した事など
>>
>>  [6]の結果、真っ白画面になってしまいました。
>>
>>  まず、ログインproxy用プログラム(以下、proxyプログラム)中で
>>  $_ENV が使われていますが、これは空の配列であることがわかりました。
>>
>>  仕方ないので $_ENVの代わりに $_SERVER に置き換えました。
>>  $_SERVER['eduPersonTargetedID'] というものも返って来ない(NULL)の
>>  ため、$_SERVER['eppn'] としてみました。
>>  このあたりの改造は、本メール冒頭の★印のプログラムを参考に
>>  させていただきました。
>>
>>  IdP認証後にSPの/login/に戻ってきた際に、NetCommons側(/htdocs/)
>>  にリダイレクトされてしまうと、原因調査ができません。そこで以後は
>>  次のようにリダイレクトさせている箇所はコメントアウトしました。
>>    // ログイン後のトップページへリダイレクトする
>>  //header("HTTP/1.1 302 Found");
>>    //header("Location: https://sptest.igakuken.or.jp/htdocs");
>>  ?>
>>
>>  動作確認には、Firefox 18.02 とFirebug を使っているのですが、
>>  session_cookie が deleted になってしまっていることがわかりました。
>>    $app_cookies = $http->getResponseCookies();
>>  に失敗している様子です。
>>
>>  [4]の☆1と☆2の各第2引数は、NetCommons用の正しいユーザ名と
>>  パスワードにしなくてはならないのかなと考え、実際に即値で
>>  記述して動作を確認してみました。例えば、ユーザ名が igakuserで
>>  パスワードが igakpass ならば、次のように書き換えました。
>>
>>    $http->addPostData("login_id", "igakuser"); ←☆1
>>    $http->addPostData("password", "igakpass"); ←☆2
>>
>>  しかし、これでもsession_cookie が deleted になってしまって
>>  います。
>>
>>    $http =& new HTTP_Request("https://sptest.igakuken.or.jp/login");
>>  としているところのパス部分(末尾)を次のように変えてみました。
>>    $http =& new HTTP_Request("https://sptest.igakuken.or.jp/htdocs");
>>
>>  これで試してみても同様にsession_cookie が deleted になって
>>  しまってます。
>>
>>  もちろん、何かやり直すたびに、Firefoxを再起動させてから試して
>>  います。
>>
>>  session_cookieさえちゃんと取得できるようになれば、認証はうまく
>>  いくような気がするのですが、いかがでしょう。
>>
>>  長くなって申し訳ありませんが、どうかご教授の程よろしくお願い
>>  致します。
>>
>> --
>> 赤沢年一
>> (公財)東京都医学総合研究所 情報システム室
> 
> ================================
>         北見工業大学技術部
>              折原 淳
>    xxxxxxx@xxxxxxxxxxxxxxxxxxxx
> ================================
>