我正在使用 Javascript + PHP SDK 实现 Facebook 登录流程。我想从 Javascript 获取访问令牌并将其传递给 PHP,PHP 应该扩展它(以获得长期访问令牌),必须将其存储在数据库中以便在一个月内发出 API 请求。我是 Web 开发的新手,所以为了在有限的时间内获得结果,我查阅了大量的文档和教程,并想出了这两个主要的代码块。这是我非常标准的 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;
我正在一个 Linux 服务器上工作,我在其中设置了 LAMP 和 MySQL,并且我有一个保存在其中的“脚本”文件夹:fb-script.js、login.php 和 Facebook 的 PHP SDK 4。在这个脚本文件夹之外,我有我的 HTML 文件。
现在我想指出以下问题:
- 我无法真正理解 javascript sdk 和 php 是如何绑定在一起的?我错过了什么还是没有证据表明他们有任何关系?我应该插入任何 AJAX 代码以将某些内容传递给 PHP,还是 Helper 足够聪明来处理所有事情?
- 当用户单击登录按钮时,我应该期望在服务器端发生什么?我知道在 javascript 上一切正常,我如何检查 PHP?我试图查看数据库但那里什么都没有,所以我继续'myhost.it/script/login.php'。但我只得到一个空白页。查看控制台,我没有错误,但是当我刷新页面时,我得到“错误 500”。
- 你能在我的代码中发现任何错误吗?我注意到我 100% 确定我在做什么,这有点令人沮丧。
我希望我说清楚了感谢大家花时间和精力阅读本文并帮助我。
问候,贾科莫