Facebook Graph API, ¿cómo obtener el correo electrónico de los usuarios?

86

Estoy usando Graph API, pero no puedo averiguar cómo obtener la dirección de correo electrónico de un usuario que haya iniciado sesión.

La introducción a Graph dice "La API de Graph puede proporcionar acceso a todos los datos básicos de registro de cuenta que normalmente solicitaría en un formulario de registro para su sitio, incluido el nombre, la dirección de correo electrónico, la foto de perfil y la fecha de nacimiento".

Todo muy bien, pero ¿cómo accedo a esa información?

Esto es lo que tengo hasta ahora:

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

$first = $json['first_name']; // gets first name
$last = $json['last_name'];
Kylex
fuente
3
¿Qué var_dump($obj);salida?
Jayrox

Respuestas:

76

La única forma de obtener la dirección de correo electrónico de los usuarios es solicitar permisos extendidos en el campo de correo electrónico. El usuario debe permitirle ver esto y no puede obtener las direcciones de correo electrónico de los amigos del usuario.

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

Puede hacer esto si está usando Facebook connect pasando scope = email en la cadena de obtención de su llamada al Diálogo de autenticación.

Recomendaría usar un SDK en lugar de file_get_contents, ya que hace que sea mucho más fácil realizar la autenticación Oauth .

Gazler
fuente
De acuerdo, archivo_get_contents cambiado. Pero estoy un poco confundido en cuanto a dónde pasaría el req_perms = email.
kylex
10
No importa, lo descubrí: $ facebook-> getLoginUrl (array ('req_perms' => 'email'))
kylex
14
No fue completamente obvio para mí según esta respuesta ... si está utilizando la API de JavaScript, desea usarFB.api('/me?scope=email', function(apiResponse) { ... });
Olson.dev
58
// 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']
);
masakielástica
fuente
2
¿Hay en algún lugar una página de referencia que describa la /meruta? Sigo navegando por las páginas en Graph API y no puedo encontrarlo en ningún lado :(
Radu Murzea
3
/ me? locale = en_US & fields = name, el correo electrónico fue la única forma en que pude averiguar para que devolviera la dirección de correo electrónico, no pude encontrar ninguna otra referencia a esto en línea
Ashley
aquí están los documentos - developers.facebook.com/docs/graph-api/reference/user @RaduMurzea
arku
1
Esta es la respuesta correcta, aunque puede encontrar una explicación más simple aquí: stackoverflow.com/questions/37349618/…
HoldOffHunger
gracias por esto .. nada más funcionó excepto esto. ¡ahora está funcionando bien! :)
supersan
19

Abra base_facebook.php Agregue Access_token en la función getLoginUrl()

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

y alcance de uso para el permiso de correo electrónico

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

Para obtener el correo electrónico del usuario, debe iniciar sesión en el usuario con su cuenta de Facebook usando el emailpermiso. Use para eso el SDK de PHP de Facebook ( ver en github ) de la siguiente manera.

Primero verifique si el usuario ya ha iniciado sesión:

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;
    }
}

Si no es así, puede mostrar el enlace de inicio de sesión solicitando el emailpermiso:

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

Cuando está conectado, el correo electrónico se puede encontrar en la $user_profilematriz.

Espero que ayude !

Quentin
fuente
6

Simplemente agregue este bloque de código en el retorno de estado y comience a pasar un objeto de cadena de consulta {}. Para desarrolladores de JavaScript

Después de inicializar su sdk.

paso 1: // obtener el estado de inicio de sesión

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

Esto comprobará la carga del documento y comprobará el estado de inicio de sesión si los usuarios han iniciado sesión.

Luego se llama a la función checkLoginState y la respuesta se pasa a statusChangeCallback

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

Paso 2: le permite obtener los datos de respuesta del estado

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 !');
    }
  }

Esto también tiene el ID de usuario que se establece en variable, luego se llama a una función getUserInfo para obtener información del usuario usando 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);
      }
    );
  }

Después de pasar el ID de usuario como argumento, la función obtiene toda la información relacionada con ese ID de usuario . Nota: en mi caso, estaba buscando el correo electrónico, ya que me permitió ejecutar una función que puede iniciar sesión como usuario solo por correo electrónico.

// iniciar sesión por correo electrónico

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 !');
      }
    });
  }
Delino
fuente
Hola @Pang, puedes comprobarlo ahora, creo que esto podría ayudar. pero mejor aún puedes comentar más problemas.
Delino
+ estado de héroe, solo para '/' + userId + '/? fields = id, name, email' que no se especifica en la documentación
therightstuff
5

Puede recuperar la dirección de correo electrónico del perfil del usuario que inició sesión. Aquí está el fragmento de código

<?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"]);
    }
?>
Yash Kumar
fuente
4
Esto no me funciona. $user_profileno contiene correo electrónico
zed Blackbeard
3

Suponiendo que solicitó permisos de correo electrónico cuando el usuario inició sesión desde su aplicación y tiene un token válido,

Con la API de búsqueda , puedes

const token = "some_valid_token";
const response = await fetch(
        `https://graph.facebook.com/me?fields=email&access_token=${token}`
      );
const result = await response.json();

el resultado será:

{
    "id": "some_id",
    "email": "[email protected]"
}

La identificación será devuelta de todos modos.

Puede agregar más cosas a los parámetros de consulta de campos, pero necesita permisos para ellos si no están en el perfil público (el nombre es público).

?fields=name,email,user_birthday&token=

https://developers.facebook.com/docs/facebook-login/permissions

Gabriel P.
fuente
Amo una respuesta que no asume el uso de un SDK que no es necesario.
Lilleman
1

El correo electrónico en el perfil se puede obtener con un permiso extendido, pero supongo que no es posible obtener el correo electrónico utilizado para iniciar sesión en Facebook. En mi aplicación, quería mostrar varias cuentas de fb de un usuario en una lista, quería mostrar los correos electrónicos de inicio de sesión de las cuentas de fb como un identificador único de las cuentas respectivas, pero no pude sacarlo de fb, todo lo que obtuve fue el correo electrónico principal en el perfil de usuario, pero en mi caso mi correo electrónico de inicio de sesión y mi correo electrónico principal son diferentes.

Karthik Sekar
fuente
0

Asegúrese de que su aplicación de Facebook esté publicada. Para recibir datos por correo electrónico, public_profile y user_friends, su aplicación debe estar disponible para el público.

Puede deshabilitarlo más tarde para fines de desarrollo y aún obtener el campo de correo electrónico.

Didzis
fuente
0

Asegúrese de especificar completamente el número de versión de la API como algo como "v2.11"y no"2.11"

No estoy seguro de cuál es el valor predeterminado si esto es incorrecto, pero tuve algunos errores extraños al intentar recuperar el correo electrónico cuando me perdí el v.

Simon_Weaver
fuente
0

Para mí, el problema con la recopilación de la dirección de correo electrónico del usuario en el lado de PHP (método getGraphUser ()) fue que el comportamiento predeterminado del botón renderizado en Facebook (en el lado WEBSIDE, creado con xfbml = 1) es llamar implícitamente a FB.login () con el alcance NO incluye "correo electrónico".

Eso significa que DEBE:

1) llamar

FB.login (...., {alcance: correo electrónico})

manifiestamente, creando su propio botón para iniciar el proceso de inicio de sesión

O

2) agregue el atributo scope = "email" al botón xfbml

<div class = "fb-login-button" data-size = "large" data-button-type = "continue_with" data-
layout = "redondeado" data-auto-logout-link = "falso" data-use-continue-as = "true" data-
width = "1000px" scope = "email"> </div>

para poder recopilar direcciones de correo electrónico en el lado de PHP.

Espero eso ayude.

Marek Wysmułek
fuente
0

Primero, active su aplicación en el centro de desarrolladores de Facebook . Las aplicaciones en modo de desarrollo no pueden recuperar el campo de correo electrónico.

Si el usuario no ha iniciado sesión, debe iniciar sesión y especificar que su aplicación / sitio necesitará el campo de correo electrónico.

FB.login(
    function(response) {
         console.log('Welcome!');
    },
    {scope: 'email'}
);

Luego, después del inicio de sesión, o si el usuario ya está registrado, recupere el correo electrónico usando la API de Facebook, especificando el campo correo electrónico:

FB.api('/me', {fields: 'name,email'}, (response) => {
    console.log(response.name + ', ' + response.email);
    console.log('full response: ', response);
});
Derzu
fuente