There are several ways to fix this.
1) You must update the access token in the cookie every time, FB does not do this automatically. Therefore, do not forget to specify FB.init with the status: true parameter.
FB.init({ appId : window.fbId, cookie : true, status : true, version : 'v2.3' });
Then, when you refresh each page, you should call FB.getLoginStatus(); regardless of whether you are already connected to Facebook.
This does not work if your application needs to make some ajax calls - simply because the access token is not updated when you do ajax (unless you call FB.getLoginStatus(); before each ajax call - and this overflows).
2) It is better to store the access token in the session after connecting the user through the FB JS SDK. PHP code might look like this:
try { $fbToken = isset($_SESSION['fbToken']) ? $_SESSION['fbToken'] : NULL; if ($fbToken !== NULL) { $session = new \Facebook\FacebookSession($fbToken); } else { $helper = new FacebookJavaScriptLoginHelper(); $session = $helper->getSession(); } } catch(\Facebook\FacebookRequestException $ex) { log_message('error', 'Facebook e1 :' . $ex->getCode()); log_message('error', 'Facebook e1 :' . $ex->getMessage()); } catch(\Exception $ex) { log_message('error', 'Facebook e2 :' . $ex->getCode()); log_message('error', 'Facebook e2 :' . $ex->getMessage()); } if ($session) { $accessToken = $session->getAccessToken(); $longLivedAccessToken = $accessToken->extend(); $_SESSION['fbToken'] = $longLivedAccessToken; $request = (new FacebookRequest($session, 'GET', '/me'))->execute(); $user = $request->getGraphObject()->asArray(); return $user; } else { return FALSE; } }
Hope I really helped ... Greetings.
source share