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

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

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

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

Q&A

解決済

1回答

3218閲覧

【PHP】Facebookログイン機能作成について

tajix_japan

総合スコア132

PHP

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

1グッド

1クリップ

投稿2016/10/09 22:22

Facebookのログインをphpで作っています。

公式サイトをもとに下記としました。


【index.php】

<?php session_start(); header("Content-type: text/html; charset=utf-8"); //設定ファイル require_once("config.php"); $helper = $fb->getRedirectLoginHelper(); $permissions = [];//あなたの公開プロフィール。 $loginUrl = $helper->getLoginUrl('http://www.hoge.com/callback.php', $permissions); echo '<a href="' . $loginUrl . '">getLoginUrl経由ログイン</a>'; ?>

【callback.php】

<?php session_start(); header("Content-type: text/html; charset=utf-8"); //設定ファイル require_once("config.php"); //タイムゾーンの設定 date_default_timezone_set('asia/tokyo'); $helper = $fb->getRedirectLoginHelper(); try { if (isset($_SESSION['facebook_access_token'])) { $accessToken = $_SESSION['facebook_access_token']; } else { //アクセストークンを取得する $accessToken = $helper->getAccessToken(); } } catch(Facebook\Exceptions\FacebookResponseException $e) { // When Graph returns an error echo 'Graph returned an error: ' . $e->getMessage(); exit; } catch(Facebook\Exceptions\FacebookSDKException $e) { // When validation fails or other local issues echo 'Facebook SDK returned an error: ' . $e->getMessage(); exit; } if (isset($accessToken)) { //アクセストークンをセッションに保存 $_SESSION['facebook_access_token'] = (string) $accessToken; header('Location: member.php'); exit(); }else{ echo "<a href='index.php'>はじめのページへ</a>"; }; ?>

【member.php】

<?php 会員ページ ?>

上記のPHPを作成し、テストしました。

++++++++++++++++++++++++++
テスト1回目結果

【index.php】

getLoginUrlを経由してログイン

【callback.php】
表示内容
Facebook SDK returned an error: Cross-site request forgery validation failed. Required param "state" missing.

というエラーが出ました。
++++++++++++++++++++++++++

そこで
いろいろ調べてみたとところ。下記の書き込みを見つけました。
http://stackoverflow.com/questions/31347341/the-state-param-from-the-url-and-session-do-not-match
「I had the same error.
The problem occurred because I did getLoginUrl(...) before getAccessToken()
So rid of getLoginUrl(...) in redirected URL and code should works

This is the answer!!! Thank you so much!!!! – Till Aug 12 '15 at 11:08
you're welcome :) – tasmaniski Aug 12 '15 at 11:15
This helped me! Thanks! – Wesley Lachenal Aug 14 '15 at 4:03
Worked Perfect. Thank You @tasmaniski – Kirs Sudh May 21 at 4:35 」

どうも、getLoginUrlとgetAccessTokenの順番が原因のようです。

そこで下記のようにindex.phpにgetLoginUrlを経由しないで直接callback.phpにアンカーを渡すリンクを張りました。


【index.php】

<?php session_start(); header("Content-type: text/html; charset=utf-8"); //設定ファイル require_once("config.php"); $helper = $fb->getRedirectLoginHelper(); $permissions = [];//あなたの公開プロフィール。 $loginUrl = $helper->getLoginUrl('http://www.hoge.com/callback.php', $permissions); echo '<a href="' . $loginUrl . '">getLoginUrl経由ログイン</a>'; echo '<a href="http://www.hoge.com/callback.php">getLoginUrlを経由せずログイン</a>'; ?>

上記に書き換えたindex.phpをアップし下記のテストをしました。

++++++++++++++++++++++++++++++++++++++

テスト2回目

【index.php】

getLoginUrlを経由せずログイン

【callback.php】

isset($accessToken) にならず、
<a href='index.php'>はじめのページへ</a>
が表示される
(1回目のようにエラーにならない!!!)

【index.php】

今度は、
getLoginUrlを経由してログイン

【callback.php】

isset($accessToken) になったようで、めでたく

【mebmber.php】が表示される

+++++++++++++++++++++++++++++++++++++++++

上記のように、めでたく【mebmber.php】が表示されました。

getLoginUrlとgetAccessTokenの順番が原因だったようです。


やりたいこと


上記のように
【index.php】→【callback.php】→【index.php】→【callback.php】→【mebmber.php】と移動しないとログインできないのは本意ではありません。

【index.php】→【callback.php】→【mebmber.php】

としたいです。

【index.php】の中に
「【index.php】&【callback.php】&【index.php】」の内容を続けて記載したのですがFacebook SDK returned an error: Cross-site request forgery validation failed. Required param "state" missing. エラーとなってしまいました。

【index.php】または【callback.php】をどのように記載すればいいでしょうか?

よろしくお願いいたします。

act823👍を押しています

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

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

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

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

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

YuzuRyo61

2016/10/10 03:51

ソースコードを"```"(コード形式)で囲ってもらえませんか?また何か使っているライブラリがありましたら掲載していただくと幸いです。
guest

回答1

0

ベストアンサー

エラーの内容はCSRF対策として作ったトークン(state)がマッチしないためにおきているようですね
基本的な流れとしては、getLoginUrl()を実行したときに、トークンが作成され、getAccessToken()を実行したときにそのトークンの検証が行われるようです。
考えられる原因としては、

  • トークンはSessionに保存されるので、session_start();がされているか

コードを見る限りされているのでたぶんこれではなさそうですね

  • getLoginUrl()からgetAccessToken()の間に別のgetLoginUrl()を実行していないか

途中で別のgetLoginUrl()を実行するとsessionのトークンの値が書き換わってしまい。後にgetAccessToken()で検証するときにトークンが合わなくなるようです。
コードを見る限りそういった処理はなさそうですが、見えていない部分でそういった処理はないでしょうか

あとは$_SESSION['FBRLH_state']というのが実際のトークンみたいなのでこの値を各所で出力してみて、値が変わる処理がないか調べるといいかと思います。

投稿2016/10/13 09:48

popobot

総合スコア6586

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

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

tajix_japan

2016/10/15 06:42

ありがとうございます。 またお返事が遅くなり申し訳御座いません。 >コードを見る限りそういった処理はなさそうですが、見えていない部分でそういった処理>はないでしょうか はい、見当たりませんでした。 >あとは$_SESSION['FBRLH_state']というのが実際のトークンみたいなのでこの値を各所>で出力してみて、値が変わる処理がないか調べるといいかと思います。 出力してみたところ、callback.php に上手く渡っていませんでした。 なぜ渡っていないかは不明です。 とりあえず、時間もないのでまずは、 【index.php】→【callback.php】→【index.php】→【callback.php】→【mebmber.php】 と自動遷移させて使ってみます。 あとでゆっくり、SESSIONが渡らない原因を調べてみます。 お手数をお掛けし本当にありがとうございました。 深く御礼申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問