0

Javascript + PHP SDK を使用して Facebook のログイン フローを実装しています。Javascript からアクセス トークンを取得し、それを PHP に渡して (有効期間の長いアクセス トークンを取得するために) 拡張する必要があります。これは、1 か月以内に API 要求を行うためにデータベースに格納する必要があります。私は Web 開発にまったく慣れていないので、限られた時間で結果を達成するために、大量のドキュメントとチュートリアルにアクセスして、この 2 つの主要なコード ブロックを考え出しました。これは私の非常に標準的な fb-login.js です

function openWindow(url){
  window.open(url, '_blank');
  window.focus();
}

function statusChangeCallback(response) {

    if (response.status === 'connected') {     //user is authorized
        getUserData();
    } else {  //user is not authorized

    }}

window.fbAsyncInit = function() {
    //SDK loaded, initialize it
    FB.init({
        appId      : XXXXXXXXXX,
        xfbml      : true,
        cookie     : true,
        version    : 'v2.2'
    });

    //check user session and refresh it
    FB.getLoginStatus(function(response) {
            statusChangeCallback(response);
    });
};


//load the JavaScript SDK
(function(d, s, id){
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) {return;}
    js = d.createElement(s); js.id = id;
    js.src = "//connect.facebook.net/en_US/sdk.js";
    fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));

//add event listener to login button
document.addEventListener("DOMContentLoaded", function() { 
    document.getElementById('loginBtn').addEventListener('click', function() {
        //do the login
        FB.login(function(response) {
            if (response.authResponse) {
                var accessToken = response.authResponse.accessToken;
                console.log(accessToken);
                getUserData();
                //user just authorized your app               
            }
        }, {scope: 'email,public_profile,user_events,user_videos,user_photos,user_groups,user_friends,user_likes,user_tagged_places,user_actions.books,read_mailbox,read_stream', return_scopes: true});
        //window.location.assign("http://www.giacomogiorgianni.me/questionnaire.html");
    openWindow('//www.giacomogiorgianni.me/questionnaire.html');

    });
});

これは私の「login.php」ファイルです:

require 'fb-php-sdk4/autoload.php'
/* USE NAMESPACES */
use Facebook\FacebookSession;
use Facebook\FacebookJavascriptLoginHelper;
use Facebook\FacebookRequest;
use Facebook\FacebookRequestException
use Facebook\FacebookResponse;
use Facebook\FacebookSDKException;


use Facebook\GraphObject;
use Facebook\GraphUser;
use Facebook\GraphSessionInfo;

use Facebook\Entities\AccessToken; 

$app_id = XXXXXXXXXXXXX;
$app_secret= XxXxxxxxxxXXXXxXXXXxxxXXXXxXX;

//Initialize application, create helper object and get fb sess
FacebookSession::setDefaultApplication($app_id,$app_secret);

session_start();

//check for existing session and validate it
if (isset($_SESSION['token'])) {
  $session = new FacebookSession($_SESSION['token']);
  if (!$session->Validate($app_id, $app_secret)) {
    unset($session);
  }
}

//get new session
if (!isset($session)) {
  try {
    $helper = new FacebookJavaScriptLoginHelper();
    $session = $helper->getSession();
    $_SESSION['token'] = $session->getToken();
    $token = $_SESSION['token'];
    $longLivedToken = $token->extend();
  } catch(FacebookRequestException $e) {
    unset($session);
    echo $e->getMessage();
  }
}

if (isset($session)) {
  $me = (new FacebookRequest(
    $session, 'GET', '/me'
  ))->execute()->getGraphObject(GraphUser::className());
  //$id = $me->getId();
  $name = $me->getName();
  echo $name;
}

// Database connection
$user = "root";
$password = "XXXXXXX";

try{
    $db = new PDO("mysql:host=127.0.0.1;dbname=prova",$user,$password);
    var_dump($db);
    //GGracefully handling Errors
    setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    echo "Connessione riuscita";
} catch (Exception $e) {
    echo "Impossibile connettersi al Database /n";
    echo 'E\' stato rilevato il seguente errore: ' . $e->getMessage();
    exit;
}

try{
    $sql = "INSERT INTO prova (id, name, access_token_id) VALUES ($id, $name, $longLivedToken)";
    $db->exec($sql);
    echo "Record inserito nella tabella";
    } catch {
        echo "Impossibile inserire la query";
        echo 'E\' stato rilevato il seguente errore: ' . $e->getMessage();
        exit;
}
    $conn = null;

私はLAMPとMySQLを設定したLinuxサーバーで作業しており、「スクリプト」フォルダーを保持しています:fb-script.js、login.php、およびFacebook用のPHP SDK 4。このスクリプト フォルダの外に、HTML ファイルがあります。

ここで、次の質問を指摘したいと思います。

  • javascript sdk と php がどのように結合されているのか本当に理解できませんか? 私は何かを見逃していますか、それとも関係があるという証拠はありませんか? 何かを PHP に渡すために AJAX コードを挿入する必要がありますか?
  • ユーザーがログインボタンをクリックすると、サーバー側で何が起こると予想されますか? JavaScript ですべてが機能していることはわかっていますが、PHP で確認するにはどうすればよいですか? データベースを調べようとしましたが、そこには何もなかったので、「myhost.it/script/login.php」に進みました。しかし、私は空白のページしか取得しません。コンソールを見るとエラーはありませんが、ページを更新すると「エラー 500」が表示されます。
  • 私のコードの間違いを見つけることができますか? 私は自分がやっていることを 100% 確信しており、それは少しイライラします。

これを読んで私を助けてくれたあなたの時間と努力に感謝します.

こんにちは、ジャコモ

4

1 に答える 1

0

JavascriptLoginHelper がすべてのプロセスを処理するため、クライアントからサーバーへの AJAX POST は必要ありませんでした。

サーバーでどのような問題が発生したか (エラー 500) を理解するために、ターミナルを開いて次のように書きました。 「sudo tail /var/log/apache2/error.log」を使用します (私のホストは DigitalOcean です)。それ以来、サーバー側の問題をすべてデバッグすることができました。

私のエラーは、「autoload.php」に小さなバグがあることが原因でした。実際、私はそれを開いて、autoload.php の 49 行目で「/src/Facebook/」を「/src/lib/Facebook/」に置き換える必要がありました。現在、すべて正常に動作しています。

あなたの提案に感謝し、これが誰かに役立つことを願っています.

乾杯!

于 2015-01-31T14:59:10.033 に答える