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】をどのように記載すればいいでしょうか?
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー