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'];
php
json
facebook
facebook-graph-api
Kylex
fuente
fuente
var_dump($obj);
salida?Respuestas:
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 .
fuente
FB.api('/me?scope=email', function(apiResponse) { ... });
// 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'] );
fuente
/me
ruta? Sigo navegando por las páginas en Graph API y no puedo encontrarlo en ningún lado :(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')); }
fuente
Para obtener el correo electrónico del usuario, debe iniciar sesión en el usuario con su cuenta de Facebook usando el
email
permiso. 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
email
permiso: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_profile
matriz.Espero que ayude !
fuente
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 !'); } }); }
fuente
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"]); } ?>
fuente
$user_profile
no contiene correo electrónicoSuponiendo 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).
https://developers.facebook.com/docs/facebook-login/permissions
fuente
https://graph.facebook.com/me
le dará información sobre el usuario que ha iniciado sesión actualmente, pero deberá proporcionar un token de oauth. Ver:
http://developers.facebook.com/docs/reference/api/user
fuente
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.
fuente
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.
fuente
Las siguientes herramientas pueden resultar útiles durante el desarrollo:
https://developers.facebook.com/tools/debug/accesstoken/
https://developers.facebook.com/tools/explorer
fuente
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
.fuente
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
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
para poder recopilar direcciones de correo electrónico en el lado de PHP.
Espero eso ayude.
fuente
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); });
fuente