web-dev-qa-db-fra.com

Facebook Graph API, comment obtenir les emails des utilisateurs?

J'utilise l'API Graph, mais je ne vois pas comment obtenir l'adresse électronique d'un utilisateur connecté.

L'introduction de Graph indique "L'API Graph peut donner accès à toutes les données d'inscription de compte de base que vous demanderiez normalement dans un formulaire d'inscription pour votre site, y compris le nom, l'adresse électronique, le profil et l'anniversaire"

Tout va bien, mais comment puis-je accéder à cette information?

C'est ce que j'ai jusqu'ici:

$json = $facebook->api('/me');

$first = $json['first_name']; // gets first name
$last = $json['last_name'];
76
kylex

Le seul moyen d'obtenir l'adresse de messagerie des utilisateurs consiste à demander des autorisations étendues sur le champ de messagerie. L'utilisateur doit vous autoriser à voir ceci et vous ne pouvez pas obtenir les adresses de messagerie de ses amis.

http://developers.facebook.com/docs/authentication/permissions

Vous pouvez le faire si vous utilisez Facebook Connect en transmettant scope = email dans la chaîne get de votre appel à Auth Dialog.

Je recommanderais d'utiliser un SDK à la place de file_get_contents car cela facilite beaucoup l'exécution de Oauth authentication.

69
Gazler
// Facebook SDK v5 for PHP
// https://developers.facebook.com/docs/php/gettingstarted/5.0.0

$fb = new Facebook\Facebook([
  'app_id' => '{app-id}',
  'app_secret' => '{app-secret}',
  'default_graph_version' => 'v2.4',
]);

$fb->setDefaultAccessToken($_SESSION['facebook_access_token']);
$response = $fb->get('/me?locale=en_US&fields=name,email');
$userNode = $response->getGraphUser();
var_dump(
    $userNode->getField('email'), $userNode['email']
);
51
masakielastic

Ouvrez base_facebook.php Ajoutez Access_token à la fonction getLoginUrl() 

array_merge(array(
                  'access_token' => $this->getAccessToken(),
                  'client_id' => $this->getAppId(),
                  'redirect_uri' => $currentUrl, // possibly overwritten
                  'state' => $this->state),
             $params);

et utiliser la portée pour l'autorisation de courrier électronique

if ($user) {
   echo $logoutUrl = $facebook->getLogoutUrl();
} else {
   echo $loginUrl = $facebook->getLoginUrl(array('scope' => 'email,read_stream'));
}
19
Kaletha

Pour obtenir le courrier électronique de l'utilisateur, vous devez vous connecter avec son compte Facebook à l'aide de l'autorisation email. Utilisez pour cela le SDK Facebook PHP ( voir sur github ) comme suit.

Commencez par vérifier si l'utilisateur est déjà connecté:

require "facebook.php";
$facebook = new Facebook(array(
    'appId'  => YOUR_APP_ID,
    'secret' => YOUR_APP_SECRET,
));

$user = $facebook->getUser();
if ($user) {
    try {
        $user_profile = $facebook->api('/me');
    } catch (FacebookApiException $e) {
        $user = null;
    }
}

S'il ne le fait pas, vous pouvez afficher le lien de connexion vous demandant l'autorisation email:

if (!$user) {
    $args = array('scope' => 'email');
    echo '<a href="' . $facebook->getLoginUrl() . '">Login with Facebook</a>';
} else {
    echo '<a href="' . $facebook->getLogoutUrl() . '">Logout</a>';
}

Lorsqu'il est connecté, l'e-mail peut être trouvé dans le tableau $user_profile.

J'espère que cela pourra aider !

6
Quentin

Vous pouvez récupérer l'adresse email du profil de l'utilisateur connecté. Voici l'extrait de code

<?php

    $facebook = new Facebook(array(
      'appId'  => $initMe["appId"],
      'secret' => $initMe["appSecret"],
    ));

    $facebook->setAccessToken($initMe["accessToken"]);
    $user = $facebook->getUser();

    if ($user) {
        $user_profile = $facebook->api('/me');
        print_r($user_profile["email"]);
    }
?>
5
Yash Kumar

L'email du profil peut être obtenu avec une permission étendue, mais je suppose qu'il est impossible d'obtenir l'email utilisé pour se connecter à fb. Dans mon application, je voulais afficher plusieurs comptes fb d'un utilisateur dans une liste, je voulais montrer les adresses e-mail de connexion des comptes fb comme identifiant unique des comptes respectifs, mais je ne pouvais pas le retirer de fb, tout ce que j'avais l'email principal dans le profil d'utilisateur mais dans mon cas, mon email de connexion et mon email principal sont différents.

1
Karthik Sekar

https://graph.facebook.com/me

vous donnera des informations sur l'utilisateur actuellement connecté, mais vous devrez fournir un jeton oauth. Voir:

http://developers.facebook.com/docs/reference/api/user

1
Bobby Jack

Ajoutez simplement ces blocs de code au retour de l’état et commencez à transmettre un objet de chaîne de requête {}. Pour les développeurs JavaScript

Après avoir initialisé votre sdk.

étape 1: // obtenir le statut de connexion

$(document).ready(function($) {
    FB.getLoginStatus(function(response) {
        statusChangeCallback(response);
        console.log(response);
    });
  });

Cela vérifiera le chargement du document et obtiendra votre statut de connexion si les utilisateurs ont été connectés.

Ensuite, la fonction checkLoginState est appelée et la réponse est transmise à statusChangeCallback

function checkLoginState() {
    FB.getLoginStatus(function(response) {
      statusChangeCallback(response);
    });
  }

Étape 2: Vous permet d'obtenir les données de réponse à partir du statut 

function statusChangeCallback(response) {
    // body...
    if(response.status === 'connected'){
      // setElements(true);
      let userId = response.authResponse.userID;
      // console.log(userId);
      console.log('login');
      getUserInfo(userId);

    }else{
      // setElements(false);
      console.log('not logged in !');
    }
  }

Ceci a également le userid qui est défini sur variable, puis un getUserInfo func est appelé pour récupérer les informations utilisateur à l'aide de Graph-api.

function getUserInfo(userId) {
    // body...
    FB.api(
      '/'+userId+'/?fields=id,name,email',
      'GET',
      {},
      function(response) {
        // Insert your code here
        // console.log(response);
        let email = response.email;
        loginViaEmail(email);
      }
    );
  }

Après avoir passé le userid en argument, la fonction extrait ensuite toutes les informations relatives à cet utilisateur userid . Remarque: dans mon cas, je recherchais l’e-mail, car cela m’a permis d’exécuter une fonction permettant de connecter l’utilisateur par e-mail uniquement.

// connexion par email

function loginViaEmail(email) {
    // body...
    let token = '{{ csrf_token() }}';

    let data = {
      _token:token,
      email:email
    }

    $.ajax({
      url: '/login/via/email',    
      type: 'POST',
      dataType: 'json',
      data: data,
      success: function(data){
        console.log(data);
        if(data.status == 'success'){
          window.location.href = '/dashboard';
        }

        if(data.status == 'info'){
          window.location.href = '/create-account'; 
        }
      },
      error: function(data){
        console.log('Error logging in via email !');
        // alert('Fail to send login request !');
      }
    });
  }
1
Delino

Assurez-vous que votre application Facebook est publiée. Pour recevoir des données par courrier électronique, public_profile et user_friends, votre application doit être rendue publique. 

Vous pouvez le désactiver ultérieurement à des fins de développement tout en obtenant le champ de courrier électronique.

0
Didzis

Assurez-vous de bien spécifier le numéro de version de l'API, par exemple "v2.11" et non "2.11".

Je ne suis pas sûr de la valeur par défaut si cela est incorrect, mais j'ai quelques erreurs étranges lorsque je tente de récupérer le courrier électronique lorsque j'ai raté la variable v.

0
Simon_Weaver

Les outils suivants peuvent être utiles lors du développement:

Débogueur de jetons d'accès: Coller dans un jeton d'accès pour plus de détails

https://developers.facebook.com/tools/debug/accesstoken/

Explorateur d’API de graphes: testez les demandes de l’API de graphe après avoir collé dans votre jeton d’accès

https://developers.facebook.com/tools/Explorer

0
Simon_Weaver