Ich verwende die Graph-API, kann jedoch nicht herausfinden, wie ich die E-Mail-Adresse eines angemeldeten Benutzers erhalten kann.
In der Einführung zu Graph heißt es: "Die Graph-API bietet Zugriff auf alle grundlegenden Kontoregistrierungsdaten, die Sie normalerweise in einem Anmeldeformular für Ihre Website anfordern, einschließlich Name, E-Mail-Adresse, Profilbild und Geburtstag.
Alles gut und gut, aber wie kann ich auf diese Informationen zugreifen?
Das habe ich bisher:
$json = $facebook->api('/me');
$first = $json['first_name']; // gets first name
$last = $json['last_name'];
Die einzige Möglichkeit, die E-Mail-Adresse des Benutzers zu erhalten, besteht darin, erweiterte Berechtigungen für das E-Mail-Feld anzufordern. Der Benutzer muss Ihnen erlauben, dies zu sehen, und Sie können keine E-Mail-Adressen der Freunde des Benutzers erhalten.
http://developers.facebook.com/docs/authentication/permissions
Sie können dies tun, wenn Sie Facebook Connect verwenden, indem Sie scope = email in der get-Zeichenfolge Ihres Anrufs an den Auth-Dialog übergeben.
Ich würde empfehlen, ein SDK anstelle von file_get_contents zu verwenden, da dies die Authentifizierung mit Oauth wesentlich einfacher macht.
// 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']
);
Öffne base_facebook.php Füge Access_token bei der Funktion getLoginUrl()
hinzu.
array_merge(array(
'access_token' => $this->getAccessToken(),
'client_id' => $this->getAppId(),
'redirect_uri' => $currentUrl, // possibly overwritten
'state' => $this->state),
$params);
und Nutzungsbereich für E-Mail-Erlaubnis
if ($user) {
echo $logoutUrl = $facebook->getLogoutUrl();
} else {
echo $loginUrl = $facebook->getLoginUrl(array('scope' => 'email,read_stream'));
}
Um die Benutzer-E-Mail zu erhalten, müssen Sie den Benutzer mit seinem Facebook-Konto mit der Berechtigung email
anmelden. Verwenden Sie dazu das Facebook PHP SDK ( siehe auf github ) wie folgt.
Prüfen Sie zunächst, ob der Benutzer bereits angemeldet ist:
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;
}
}
Ist dies nicht der Fall, können Sie den Login-Link anzeigen lassen, in dem Sie nach der Berechtigung email
gefragt werden:
if (!$user) {
$args = array('scope' => 'email');
echo '<a href="' . $facebook->getLoginUrl() . '">Login with Facebook</a>';
} else {
echo '<a href="' . $facebook->getLogoutUrl() . '">Logout</a>';
}
Wenn er eingeloggt ist, befindet sich die E-Mail im $user_profile
-Array.
Hoffentlich hilft das !
Sie können die E-Mail-Adresse aus dem Profil des angemeldeten Benutzers abrufen. Hier ist das Code-Snippet
<?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"]);
}
?>
Die E-Mail im Profil kann mit erweiterter Berechtigung abgerufen werden, aber ich denke, es ist nicht möglich, die E-Mail zum Anmelden von fb zu erhalten. In meiner App wollte ich mehrere fb-Konten eines Benutzers in einer Liste anzeigen. Ich wollte die Login-E-Mails von fb-Konten als eindeutige Kennung der jeweiligen Konten anzeigen, konnte sie aber nicht von fb abrufen die primäre E-Mail im Benutzerprofil, aber in meinem Fall unterscheiden sich meine Login-E-Mail und meine primäre E-Mail.
sie erhalten Informationen über den aktuell angemeldeten Benutzer. Sie müssen jedoch ein Oauth-Token angeben. Sehen:
Fügen Sie diese Codeblöcke bei Statusrückgabe hinzu und übergeben Sie ein Abfragezeichenfolgeobjekt {}. Für JavaScript-Entwickler
Nach dem Initialisieren Ihrer SDK.
schritt 1: // Anmeldestatus abrufen
$(document).ready(function($) {
FB.getLoginStatus(function(response) {
statusChangeCallback(response);
console.log(response);
});
});
Dadurch wird das Laden des Dokuments überprüft und der Anmeldestatus überprüft, ob Benutzer angemeldet sind.
Dann wird die Funktion checkLoginState aufgerufen und die Antwort an statusChangeCallback übergeben.
function checkLoginState() {
FB.getLoginStatus(function(response) {
statusChangeCallback(response);
});
}
Schritt 2: Lassen Sie sich die Antwortdaten aus dem Status entnehmen
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 !');
}
}
Dies hat auch die userid , die auf variable gesetzt wird. Dann wird eine getUserInfo func aufgerufen, um Benutzerinformationen über die Graph-API abzurufen.
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);
}
);
}
Nach dem Übergeben der userid als Argument holt die Funktion dann alle Informationen zu dieser userid . Hinweis: In meinem Fall habe ich nach der E-Mail gesucht, da ich eine Funktion ausführen konnte, die den Benutzer nur per E-Mail protokolliert.
// Login per E-Mail
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 !');
}
});
}
Stellen Sie sicher, dass Ihre Facebook-Anwendung veröffentlicht ist. Um Daten für E-Mail-Nachrichten zu erhalten, müssen Sie Ihre Anwendung öffentlich zugänglich machen.
Sie können es später für Entwicklungszwecke deaktivieren und trotzdem ein E-Mail-Feld abrufen.
Stellen Sie sicher, dass Sie die Versionsnummer der API wie "v2.11"
und nicht "2.11"
angeben.
Ich bin mir nicht sicher, was für einen Standardwert es ist, wenn dies falsch ist, aber ich habe einige seltsame Fehler beim Abrufen der E-Mail erhalten, wenn ich die Variable v
verpasst habe.
Die folgenden Tools können während der Entwicklung nützlich sein:
Access Token Debugger: Fügen Sie ein Zugriffstoken für Details ein
https://developers.facebook.com/tools/debug/accesstoken/
Graph API Explorer: Testen Sie Anforderungen an die Graph-API, nachdem Sie sie in Ihr Zugriffstoken eingefügt haben