Auhtenticationの動作について質問です

0 views
Skip to first unread message

katarou

unread,
Jun 24, 2008, 9:10:02 AM6/24/08
to Piece Framework Users (ja)
田川です。

以前、Authenticationにて認証がうまく行われない旨の投稿をした者です。

少し間が開きましたが、Authentcationのリダイレクトで条件が確認できました。
私の場合は

- name: Interceptor_Authentication
point:
- name: url
type: configuration
value: "http://example.org/authenticate.php"
- name: resources
type: configuration
value:
- "/index.php"
- "/input/Edit.php"
とした場合に、http://example.org/input/Edit.phpにアクセスし、ログインを行った後に
下記'MenuFromprocChecklogin'へ遷移してしまうようです。

認証部分のソースコード(一部)ですが

if ($authentication->hasCallbackURL()) {
$authentication->redirectToCallbackURL();
}

return 'MenuFromprocChecklogin'; //通常ここへはこない?



当方はhttp://example.org/input/Edit.phpにリダイレクトされることを想定しています。

一度現象が発生すると認証しても以後、リダイレクトは行われなくなってしまうようです。

認証ロジック自体はサンプルをそのまま流用しています。
ちなみに同じ階層であれば、現象は発生しないようです。
また、resourcesのエントリが1つの場合も発生しませんでした。

設定や制限など留意点があればご教授いただけると幸いです。
以上、お手数をおかけしますがよろしくお願いいたします。

KUBO Atsuhiro

unread,
Jun 26, 2008, 6:49:16 AM6/26/08
to piece-framew...@googlegroups.com
久保です。

2008/06/24 22:10 katarou <mail.hiro...@gmail.com>:


> 少し間が開きましたが、Authentcationのリダイレクトで条件が確認できました。
> 私の場合は
>
> - name: Interceptor_Authentication
> point:
> - name: url
> type: configuration
> value: "http://example.org/authenticate.php"
> - name: resources
> type: configuration
> value:
> - "/index.php"
> - "/input/Edit.php"
> とした場合に、http://example.org/input/Edit.phpにアクセスし、ログインを行った後に
> 下記'MenuFromprocChecklogin'へ遷移してしまうようです。

認証が完了するまでに最短で 3 回のリクエストが発生することになりますが、
その間の Interceptor_Authentication プラグインの動作は下記のようになり
ます。

1. /input/Edit.php へのリクエスト => URI を保存する
2. /autenticate.php へのリクエスト => 保護リソースでないため何も行わない
3. /autenticate.php へのリクエスト => 保護リソースでないため何も行わない

1 回目のリクエストの際に保存された URI はこの流れの中で削除されること
はありません。

また、3 回目のリクエストの際に
$authentication->redirectToCallbackURL() のコールによって
Piece_Unity_Context::setView() がコールされ保存された URI がビューとし
て設定されることになります。Dispatcher_Continuation プラグインから返さ
れるビューは、Piece_Unity_Context::getView() が null でない場合は使用
されません。(Dispatcher_Controller プラグイン)
このような仕様のため、$authentication->redirectToCallbackURL() をコー
ルした場合も、しなかった場合も、

> return 'MenuFromprocChecklogin'; //通常ここへはこない?

に到達するのは問題ありません。

さて、頂いた情報をもとにテストケースを書いてみましたが、再現させること
ができませんでした。詳しい調査のために下記のコードを、
return 'MenuFromprocChecklogin' の前に挿入し、エラーログを確認いただけないでしょうか?

require_once 'Piece/Unity/Service/Authentication/State.php';
$authenticationState = &Piece_Unity_Service_Authentication_State::singleton();
error_log(var_export($authenticationState->hasCallbackURL(null), true));
error_log(var_export($authenticationState->getCallbackURL(null), true));

hasCallbackURL() が true であっても getCallbackURL() が null であれば
リダイレクションされないことになります。

--
KUBO Atsuhiro e-mail: ku...@iteman.jp

katarou

unread,
Jun 26, 2008, 9:24:50 AM6/26/08
to Piece Framework Users (ja)
田川です。

ログの書き出し場所がわからなかったので、画面に表示したところ
false
NULL
と表示されています。


素人質問で申し訳ありません。

コードを見ていてふと気がついたのですが、入り口PHPで
ini_set('session.cookie_path', str_replace('\\', '/',
dirname($_SERVER['SCRIPT_NAME'])));
session_save_path("$base/sessions");
の記述を行っているのですが、階層が変わっても同じ記述をした場合問題はあるでしょうか?
少し、試してみます。

On 6月26日, 午後7:49, "KUBO Atsuhiro" <k...@iteman.jp> wrote:

> 久保です。
>
> 2008/06/24 22:10 katarou <mail.hiroki.tag...@gmail.com>:
> KUBO Atsuhiro e-mail: k...@iteman.jp

KUBO Atsuhiro

unread,
Jun 29, 2008, 7:43:18 AM6/29/08
to piece-framew...@googlegroups.com
久保です。

2008/06/26 22:24 katarou <mail.hiro...@gmail.com>:


> ログの書き出し場所がわからなかったので、画面に表示したところ
> false
> NULL
> と表示されています。

その結果からは URL が保存されていないか null が設定されていることにな
りますが、原因としては下記が考えられます。

1. URL が一度も保存されていない
2. URL が保存されたあと削除された
3. URL が null として保存されている

原因の特定には最初のリクエストから 3 回目のリクエストまでの
Interceptor_Authentication プラグインの内部の動きを追う必要がありそう
です。

> コードを見ていてふと気がついたのですが、入り口PHPで
> ini_set('session.cookie_path', str_replace('\\', '/',
> dirname($_SERVER['SCRIPT_NAME'])));
> session_save_path("$base/sessions");
> の記述を行っているのですが、階層が変わっても同じ記述をした場合問題はあるでしょうか?
> 少し、試してみます。

はい、階層が異なればそれに合わせた内容を設定する必要があります。
Apache であれば VirtualHost ディレクティブなどで固定値を設定し、コード
からは削除しておくといいと思います。
しかし、これらは今回の現象とは関係なさそうです。

サンプルのエントリポイントで最も問題が起こりやすいのは
Configurator_AppRoot プラグインの設定ポイント appRoot ですが、この値も
エントリポイントで設定する場合はディレクトリ階層に合わせる必要がありま
す。これも上記と同じように piece-unity-config.yaml で固定値を記述する、
あるいは共通のファイルに移動するといいと思います。

念のため基にされた Piece_Examples_Basics や
Piece_Unity_Component_Authentication, Piece_Unity などのバージョンを教
えていただけないでしょうか。

katarou

unread,
Jul 5, 2008, 5:02:20 AM7/5/08
to Piece Framework Users (ja)
田川です。

> ini_set('session.cookie_path', str_replace('\\', '/',
> session_save_path("$base/sessions");
上記2カ所をコメントアウトしたところ、ログインできない状態は無くなりました。
ありがとうございます。
リダイレクト先はNULLになっているようですので、こちらでも調べてみます。

Pieceのバージョンは最新版をいれています。
サンプルコードはIDEの作成するサンプルを利用しています。

バージョンは下記の通りです。

PHPUnit 3.2.20 stable
INSTALLED PACKAGES, CHANNEL PEAR.PIECE-FRAMEWORK.COM:
=====================================================
PACKAGE VERSION STATE
Piece_Examples_Basics 1.1.0 stable
Piece_Examples_CRUD 1.0.0 stable
Piece_Examples_Questionnaire 1.1.0 stable
Piece_Flow 1.15.1 stable
Piece_ORM 1.0.0 stable
Piece_Right 1.9.1 stable
Piece_Unity 1.4.0 stable
Piece_Unity_Component_Authentication 1.0.0 stable
Piece_Unity_Component_ContentLength 1.0.0 stable
Piece_Unity_Component_Flexy 1.2.0 stable
Piece_Unity_Component_JapaneseZ2H 1.0.0 stable
Piece_Unity_Component_NullByteAttackPreventation 1.0.0 stable
Piece_Unity_Component_PieceORM 1.1.0 stable
Piece_Unity_Component_Smarty 1.1.0 stable
Stagehand_FSM 1.9.0 stable
Stagehand_TestRunner 2.3.0 stable

※今までフォルダがことなるとセッション共有できなかったのですが、今回のことでできるようになりました。
ありがとうございます。

On 6月29日, 午後8:43, "KUBO Atsuhiro" <k...@iteman.jp> wrote:
> 久保です。
>
> 2008/06/26 22:24 katarou <mail.hiroki.tag...@gmail.com>:
> KUBO Atsuhiro e-mail: k...@iteman.jp
Reply all
Reply to author
Forward
0 new messages