質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

Q&A

解決済

1回答

6504閲覧

FuelPHP Session値の取得ができない

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

0グッド

2クリップ

投稿2016/05/23 12:46

編集2016/05/24 04:20

FuelPHPを使いログイン認証を作成してます。

開発環境
FuelPHP 1.7.2
MAMP 3.5
PHP 5.6.10
Angular 1.5.0

開発は基本的にAPIベースで作成してます。angularでAPI叩いて、Jsonで返却。
FuelPHPのSimpleAuthパッケージを用いてログイン処理を実装してます。

ログイン処理の際は、セッション変数の取得をすると、きちんと取得できます。
コードは以下のようになってます。こちらは、きちんとセッション情報が取得できます。

PHP

1$auth = Auth::instance(); 2$email = Input::json('email'); 3$password = Input::json('password'); 4if ($auth->login($email, $password)) { 5 $result['message'] = 'ログイン成功。'; 6 Session::set('session_id' , Arr::get(Auth::get_user_id(), 1)); 7 $result['session_id'] = Session::get('session_id'); 8 $session['result'] = Session::get(); 9} 10return $this->response($result);

FuelPHPの公式サイトを見ると、以下のように書いてありました。

PlainText

1ログイン成功後、 'username' と現在の 'login_hash' が、セッション変数として利用できます。

ログイン処理のAPIが叩かれ、認証OKだとAngularでマイページにログインしてます。

ログイン後のマイページの方で、セッションを取得しても「null」と返ってきてしまいます。
また、SimpleAuthの「get_user_id()」などもログイン時は取得出来ましたが、次のページに行くと取得できなくなっています。(nullが返却される。)

ログイン後のマイページで叩かれる処理。

PHP

1if (Input::get('SESSION_ID')) { 2 $result['session_id'] = Session::get('session_id'); 3 $result['username'] = Auth::get_screen_name(); 4} 5return $this->response($result);

両方とも「null」で返却されます。
app/logも確認しましたが、APIは叩けているのでエラーlogは確認できませんでした。

原因を考え調べてみましたが、今も悩んでおります。
対策として試みたこと。(fuelphpのcore以下は弄っておりません。)

・MAMP、FuelPHPのtimezoneの設定(Asia/Tokyo) ・sessionに保存しようとする値が4KBを超える→driverをfileに変更

よろしく御願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nnssn

2016/05/23 14:49

データの取得に失敗するタイミングで何かログが出力されていませんか?/app/logsを確認してみてください。もしあれば貼付してください。それとデータの取得に失敗するというのはjsonが返ってこないということで合っていますか?
退会済みユーザー

退会済みユーザー

2016/05/23 16:21

情報の追加しました。 ログはAPIは正常に動作しておりましたので、エラーログには吐き出されておりませんでした。 jsonで返っては来るのですが、値がnullで返ってきます。
退会済みユーザー

退会済みユーザー

2016/05/24 05:02

Input::get('SESSION_ID') とあるのですが、GETで該当のパラメータは確実に送られているでしょうか?
退会済みユーザー

退会済みユーザー

2016/05/24 05:04

セッションIDをAngular側でクッキーに保存し、マイページでAPIを叩く際にそのクッキーに保存されているIDを取得できているので、条件分岐内に処理が進んでいます。
guest

回答1

0

ベストアンサー

レスポンス自体は返ってきているとのことなので、可能性がありそうなものを
いくつか挙げてみます(通常、どれもエラーを返しそうな気はしますが)

###コントローラ
0. 対象のアクションが呼び出されていない
確実に対象のアクションが呼び出されているかを確認する。
すでに試行済みならこの項目はパスでかまいません。

・Session情報を一切含まないjsonを返すよう変更
・Log::warning('hoge');を挿入してログを出力
・ブラウザから直接たたく
・レスポンスが期待通りの内容か、ログが出力されているかを確認

###ファイル

  1. セッション情報が書き出されていない

ドライバーがfileだと初期設定では/tmpにセッション情報が書き出されるようです。
ログイン時ファイルが追加されるか、ディレクトリ等のパーミッションは適切か、確認をお願いします。

  1. セッションの有効期限が極端に短くなっている

/app/config/session.phpexpiration_timeが有効秒数です。この値を100倍などに
変更してログインを試してみてください。何らかの理由(時間ずれなど)でログインしたそばから
期限切れになることもありえるかもしれません。
もし、ファイルが無い場合は/core/config/session.phpをコピーして使ってください。

  1. クッキーをブロックしている

(ドライバー関係なく)クッキーをブロックするとセッションが機能しません。
ブラウザの設定を確認してみてください。

それでもダメなら、一度ドライバーをcookieに戻してログイン状態を保持できるか
試したほうがいのかもしれません。

投稿2016/05/23 21:26

nnssn

総合スコア1221

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/05/24 04:09

丁寧なご説明ありがとうございます。 コントローラ ・Session情報を一切含まないjsonを返すよう変更 → Session情報を含まないもの関してはjsonで返ってきました。 ・ブラウザから直接叩く → 次ページのメソッド内で、Input::get('SESSION_ID')からCookie::get('SESSION_ID')に変更すると動作しました。 ファイル ・/tmp に書き出されていませんでした。app/config/session.php内はdriverをfileに変更しただけで他は弄っていません。 ・セッションの有効秒数も伸ばしてみましたが特に変わりはありませんでした。 ・クッキーはブラウザに保存されているのが確認出来ましたので、ブロックはしてなさそうです。 質問内容に情報追加致します。
nnssn

2016/05/24 11:24

情報の追加ありがとうございます。Input::getはクエリストリング (クエリ文字列とかGETパラメータとか呼び方いろいろ)を取得するメソッドです。 クエリストリングはURIの?以降の部分で、例えば http://example.com/controller/action?hoge=fuga <-これだと hoge=fuga <-ここです Input::get('SESSION_ID')がtrueになるのはリクエストurlに SESSION_ID=値が含まれている場合だけになります。 条件を変えると動作したとの事なので、認証自体は成功していて 分岐部分が意図した条件になっていない可能性が高そうです。
退会済みユーザー

退会済みユーザー

2016/05/24 12:03

ありがとうございます。 その後調査したのですが、どうやらSimpleauth自体がうまくいってないようでした。 ログインのAPIを叩いた後にマイページにリダイレクトされ、その後ユーザー情報の取得するAPIを叩いた際に、Auth::checkに引っかかってました。 リダイレクト処理はAngularで実行してます。 なお、今回の作りは少し複雑でfuelのviewの中は空でWEBサーバとAPIサーバが別になっています。ブラウザ→WEBサーバ→APIサーバのような形でブラウザとAPIの間にWEBサーバが入っているため認証がうまくいってないのかもしれません。。。
nnssn

2016/05/24 12:39

ログイン処理時には値が取れている、セッションファイルは出力されていない となると、この間に問題がありそうな気はします。 現在、app/config/session.phpの file.pathの値が '/tmp' になっていると思うのですが これを APPPATH .'/tmp' に変更した場合/app/tmpに何か出力されませんか? /app/tmpディレクトリのパーミッションは書き込み可能かも確認してみてください。
退会済みユーザー

退会済みユーザー

2016/05/25 02:16

APPPATH .'/tmp'に書き換えてみると、fuelcid....のようなファイルが2つほど出力されました!
退会済みユーザー

退会済みユーザー

2016/05/25 02:19

ですが、マイページ後にAuth::checkに弾かれてしまいました。 セッションが溜まってるだけになっているんでしょうか?
nnssn

2016/05/25 10:49

> fuelcid....のようなファイルが2つほど出力されました! それがセッションファイルです。中身を確認すればhashやuser_agentが 保存されていると思います。そのAuth::checkを行っているアクション全体を 見せてもらえませんか。
退会済みユーザー

退会済みユーザー

2016/05/27 11:50

ご連絡遅れてすみません。 >それがセッションファイルです。中身を確認すればhashやuser_agentが 保存されていると思います。 はい、確認出来ました。 if (!Auth::check()) { $result['message'] = 'ログインしてください。'; } else { $result['message'] = 'ログイン中です。'; } こちらで確認してます。
nnssn

2016/05/28 02:59

いえいえ。その6行がアクションの全行でしょうか。 だとしたらreurnでレスポンスを返してないのが気になります。
退会済みユーザー

退会済みユーザー

2016/05/29 00:26

すみません、 return $this->response($result); こちらが抜けておりました。
nnssn

2016/05/29 14:11

貼っていただいたコードには問題ないように見えます。 ちょっと時間があったので、初めてfileドライバーを使ってみたのですが、 何か予想していないタイミングでセッションが再生成されているような... まだちゃんと処理の流れを理解できていないので自分の勘違いかもしれませんが、 もしかするとフレームワーク側の問題なのかもしれません。 とりあえず、当面の解決策としてSessionドライバーをdbに変更するのは どうでしょう。セッション用のテーブルを作成して、ドライバーをdbに 変更するだけなので簡単です。「fuelphp セッション db」などで検索すれば 参考になる記事がいくつか見つかると思います。
退会済みユーザー

退会済みユーザー

2016/06/04 04:48

ご返信遅くなり申し訳ございません。 解決策でご提案して頂いたように、Sessionの保存先をDBで保持しログイン処理を実装しました。ご丁寧に解説していただきありがとうございます。
nnssn

2016/06/04 09:31

解決されたようで何よりです。ドライバーを変更しただけで すんなり行くということは、やはりFileドライバーが怪しいのかも。 自分が試したときはセッションを読み込むだけでファイルが再生成されていました...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問