There is little documentation out there showing how to successfully create a new Parse user using PHP – Facebook login method. Here is the steps that worked for me:
- Add Facebook PHP-SDK in your web app
- Add Facebook SDK for JavaScript. Include the Facebook login button.
- Initialize a Facebook session. (Facebook App ID and App Secret). In your php code it should look like this:
$fb = new Facebook([ 'app_id' =>'YOUr APP ID', 'app_secret' =>'YOUR APP SECRET', 'default_graph_version' => 'v2.5', ]);
- Authenticate user with Facebook (clicking the javascript login button). Follow the facebook Javascript login button guide here:
Once the users authenticates via the login button. We will use the php javascript helper to retrieve the values to php.
$helper = $fb->getJavaScriptHelper(); $oAuth2Client = $fb->getOAuth2Client(); try { $accessToken = $helper->getAccessToken(); //getting short lived token $token = $accessToken; } catch(Facebook\Exceptions\FacebookResponseException $e) { // When Graph returns an error echo 'Graph returned an error: ' . $e->getMessage(); } catch(Facebook\Exceptions\FacebookSDKException $e) { // When validation fails or other local issues echo 'Facebook SDK returned an error: ' . $e->getMessage(); }
- Get the user’s Facebook ID.
Once we have the token. We can get the long lived token and use that to retrieve the users Facebook values:
<strong></strong> $longLivedAccessToken = $oAuth2Client->getLongLivedAccessToken($token); $longToken = $longLivedAccessToken->getValue(); $fb->setDefaultAccessToken($longLivedAccessToken); $response = $fb->get('/me?fields=id, email'); //retrieving users id and email $user = $response->getGraphUser(); $id = $user['id']; $email = $user['email'];
- Authenticate the user with Parse with ID and access code.
ParseUser::logInWithFacebook($id, $longToken);
Here is the full php and js code. You’ll have to refresh the page a few times to show the user is created and logged in.
<?php use Facebook\Facebook as Facebook; use Parse\ParseUser; use Parse\ParseClient; ?> <!DOCTYPE html> <html> <head> <title>TEST PHP</title> <link href="https://fonts.googleapis.com/css?family=Lato:100" rel="stylesheet" type="text/css"> <style> html, body { height: 100%; } body { margin: 0; padding: 0; width: 100%; display: table; font-weight: 100; font-family: 'Lato'; } .container { text-align: center; display: table-cell; vertical-align: middle; } .content { text-align: center; display: inline-block; } .title { font-size: 96px; } </style> </head> <body> <div id="fb-root"></div> <div id="fb-root"></div> <script> function statusChangeCallback(response) { console.log('statusChangeCallback'); console.log(response); // The response object is returned with a status field that lets the // app know the current login status of the person. // Full docs on the response object can be found in the documentation // for FB.getLoginStatus(). if (response.status === 'connected') { // Logged into your app and Facebook. testAPI(); } else if (response.status === 'not_authorized') { // The person is logged into Facebook, but not your app. document.getElementById('status').innerHTML = 'Please log ' + 'into this app.'; } else { // The person is not logged into Facebook, so we're not sure if // they are logged into this app or not. document.getElementById('status').innerHTML = 'Please log ' + 'into Facebook.'; } } // This function is called when someone finishes with the Login // Button. See the onlogin handler attached to it in the sample // code below. function checkLoginState() { FB.getLoginStatus(function(response) { statusChangeCallback(response); }); } window.fbAsyncInit = function() { FB.init({ appId : 'YOUR APP ID', cookie : true, // enable cookies to allow the server to access // the session xfbml : true, // parse social plugins on this page version : 'v2.5' // use graph api version 2.5 }); // Now that we've initialized the JavaScript SDK, we call // FB.getLoginStatus(). This function gets the state of the // person visiting this page and can return one of three states to // the callback you provide. They can be: // // 1. Logged into your app ('connected') // 2. Logged into Facebook, but not your app ('not_authorized') // 3. Not logged into Facebook and can't tell if they are logged into // your app or not. // // These three cases are handled in the callback function. FB.getLoginStatus(function(response) { statusChangeCallback(response); }); }; (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#xfbml=1&version=v2.6&appId=YOURAPPID"; fjs.parentNode.insertBefore(js, fjs); } (document, 'script', 'facebook-jssdk')); </script> <div class="container"> <div class="content"> <div class="title">TESTING</div> <?php //testing login $fb = new Facebook([ 'app_id' => 'YOUR APP ID', 'app_secret' => 'YOUR APP SECRET', 'default_graph_version' => 'v2.5', ]); //first check parse $currentUser = ParseUser::getCurrentUser(); if($currentUser){ echo 'user is logged in, logging out'; //ParseUser::logOut(); } else{ $helper = $fb->getJavaScriptHelper(); $oAuth2Client = $fb->getOAuth2Client(); try { $accessToken = $helper->getAccessToken(); //getting short lived token $token = $accessToken; } catch(Facebook\Exceptions\FacebookResponseException $e) { // When Graph returns an error echo 'Graph returned an error: ' . $e->getMessage(); } catch(Facebook\Exceptions\FacebookSDKException $e) { // When validation fails or other local issues echo 'Facebook SDK returned an error: ' . $e->getMessage(); } if (! isset($accessToken)) { echo 'No cookie set or no OAuth data could be obtained from cookie.'; }else{ // Logged in echo '<h3>Access Token</h3>'; $longLivedAccessToken = $oAuth2Client->getLongLivedAccessToken($token); $longToken = $longLivedAccessToken->getValue(); $fb->setDefaultAccessToken($longLivedAccessToken); $response = $fb->get('/me?fields=id, email'); $user = $response->getGraphUser(); $id = $user['id']; $email = $user['email']; ParseUser::logInWithFacebook($id, $longToken); //works } } ?> <fb:login-button scope="public_profile,email" onlogin="checkLoginState();"></fb:login-button> <div id="status"> <?php //dispayis please login to facebook message if not logged in ?> </div> </div> </body> </html>