クライアント (JS) とサーバー (PHP) の両方で Facebook SDK のメソッドを使用する必要がある小さな Facebook アプリケーションを構築しています。クライアントでは主に FB.ui メソッドを使用しており、サーバーでは Graph API をよく使用しています。
しかし、ユーザーに2回ログインを強制することなくそれを行う方法はありますか? ユーザーを一度ログインさせ、そのログインをクライアントとサーバーの両方に使用するにはどうすればよいですか? これは可能ですか?
クライアント (JS) とサーバー (PHP) の両方で Facebook SDK のメソッドを使用する必要がある小さな Facebook アプリケーションを構築しています。クライアントでは主に FB.ui メソッドを使用しており、サーバーでは Graph API をよく使用しています。
しかし、ユーザーに2回ログインを強制することなくそれを行う方法はありますか? ユーザーを一度ログインさせ、そのログインをクライアントとサーバーの両方に使用するにはどうすればよいですか? これは可能ですか?
JS および PHP で Facebook SDK を 1 回のログイン (またはログインなし) で使用する最良の方法は、トークンを使用することです。「サーバー側」のプロセスは、JS と PHP で同じです。
このプロセスは、最初のユーザー ログインや、有効期限が切れたときに新しいトークンを取得する場合に役立ちます。
これで、アプリケーションは、ユーザーのログインなしで (JS、PHP、またはその他で) Facebook に接続できます。必要な要素は、appId、secret、 user ID、および user tokenです。
お役に立てれば幸いです
チュートリアルのFacebookアプリケーションをデプロイするためにHerokuを使用したときに、私が学んだことのない巧妙なトリックが1つあります。Herokuが提供したサンプルテンプレートでは、Facebookのログインボタンがあり、次のようにauth.authResponseChangeをサブスクライブしました。-
FB.Event.subscribe('auth.authResponseChange', function(response) {
window.location = window.location;
});
これにより、ページが更新され、Facebookの認証後にJavaScriptSDKによって設定されたCookieがPHPSDKで使用できるようになります。PHP SDKを使用してユーザーにログインすることもできます。ユーザーがログインすると、JavaScriptSDKから再度ログインしなくてもJavaScriptSDKを使用できるようになります。
実際、トークンはかなり早く期限切れになるため、これは機能しません。offset_accessも削除されたため、ユーザーは、ユーザーとの接続を維持するときにFacebookアプリを明示的に使用する必要があります(トークンの有効期限が切れると、ユーザーは何もできなくなります)。
ログインのために現在のトークンを保存することはできますが、ユーザーがFB経由で再度ログインするたびにユーザーテーブルを更新する必要があります。
また、トークンを介してログインすることはできませんが、JSまたはPHPでトークンを取得するのは非常に簡単です。
FB.getLoginStatus(function(response) {
if (response.status === 'connected') {
//user is logged in and has accepted you apps stuff.
var uid = response.authResponse.userID;
var accessToken = response.authResponse.accessToken;
// do some fancy ajax function to send the token to the server here.
}
else if (response.status === 'not_authorized') {
// the user is logged in to Facebook,
// but has not authenticated your app
FB.login(function(response) {
if (response.authResponse) {
console.log('Welcome! Fetching your information.... ');
FB.api('/me', function(response) {
console.log('Good to see you, ' + response.name + '.');
});
} else {
console.log('User cancelled login or did not fully authorize.');
}
}), {scope: 'email,user_likes'}); //specify all the scopes you need for your app here.
}
else
{
//user is not logged in to facebook.
}
});
これがトークンを取得するためのJSの部分であり、PHPで取得する場合は、さらに簡単です。
<?php
require_once("/FBAPI/src/facebook.php");
$config = array();
$config['appId'] = 'your_app_id';
$config['secret'] = 'your_app_secret';
$facebook = new Facebook($config);
$user = $facebook->getUser();
if(!$user){
$loginUrl = $facebook->getLoginUrl(array('scope'=>'publish_stream', 'redirect_uri'=>'http://www.example.com'));
}
if($user){
try{
$user_profile = $facebook->api('/me');
$access_token = $facebook->getAccessToken();
}
catch(FacebookApiException $e){
error_log($e);
$user = NULL;
}
}
else{
echo '<a href="'.$loginUrl.'"><img src="img/login.png"/></a>';
}
?>
編集:実際、あなたはこのようにそれを行うことができます:
ログイン用のランディングページを表示し、ユーザーがJS経由でログインできるようにします。ログインプロセスが完了するとすぐに、ユーザーが$ facebook-> getUser()を介してログインしているかどうかを確認できます。PHPSDKの機能