Graph APIを使用していますが、ログインユーザーのメールアドレスを取得する方法がわかりません。
Graphの紹介には、「Graph APIは、名前、メールアドレス、プロフィール写真、誕生日など、サイトのサインアップフォームで通常要求するすべての基本的なアカウント登録データへのアクセスを提供できます」と記載されています。
すべて順調ですが、その情報にアクセスするにはどうすればよいですか?
これは私がこれまでに持っているものです:
$json = $facebook->api('/me');
$first = $json['first_name']; // gets first name
$last = $json['last_name'];
ユーザーの電子メールアドレスを取得する唯一の方法は、電子メールフィールドの拡張アクセス許可を要求することです。ユーザーはこれを表示できるようにする必要があり、ユーザーの友人の電子メールアドレスを取得することはできません。
http://developers.facebook.com/docs/authentication/permissions
Facebook接続を使用している場合は、認証ダイアログへの呼び出しのget文字列でscope = emailを渡すことでこれを行うことができます。
File_get_contentsの代わりに SDK を使用することをお勧めします。これは Oauth 認証の実行がはるかに簡単になるためです。
// 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']
);
Base_facebook.phpを開き、関数getLoginUrl()
にAccess_tokenを追加します
array_merge(array(
'access_token' => $this->getAccessToken(),
'client_id' => $this->getAppId(),
'redirect_uri' => $currentUrl, // possibly overwritten
'state' => $this->state),
$params);
および電子メール許可の使用範囲
if ($user) {
echo $logoutUrl = $facebook->getLogoutUrl();
} else {
echo $loginUrl = $facebook->getLoginUrl(array('scope' => 'email,read_stream'));
}
ユーザーのメールを取得するには、email
権限を使用して、Facebookアカウントでユーザーをログインする必要があります。そのために、次のようにFacebook PHP SDK( githubを参照 )を使用します。
最初に、ユーザーが既にログインしているかどうかを確認します。
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;
}
}
そうでない場合は、email
許可を求めるログインリンクを表示できます。
if (!$user) {
$args = array('scope' => 'email');
echo '<a href="' . $facebook->getLoginUrl() . '">Login with Facebook</a>';
} else {
echo '<a href="' . $facebook->getLogoutUrl() . '">Logout</a>';
}
彼がログインすると、電子メールは$user_profile
配列で見つけることができます。
それが役立つことを願っています!
ログインしているユーザーのプロファイルからメールアドレスを取得できます。これがコードスニペットです
<?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"]);
}
?>
ステータスの戻り時にこれらのコードブロックを追加し、クエリ文字列オブジェクト{}の受け渡しを開始します。 JavaScript開発者向け
SDKを初期化した後。
ステップ1://ログインステータスを取得する
$(document).ready(function($) {
FB.getLoginStatus(function(response) {
statusChangeCallback(response);
console.log(response);
});
});
これにより、ドキュメントの読み込みが確認され、ユーザーがログインしている場合はログインステータスが確認されます。
次に、関数checkLoginStateが呼び出され、応答がstatusChangeCallbackに渡されます
function checkLoginState() {
FB.getLoginStatus(function(response) {
statusChangeCallback(response);
});
}
ステップ2:ステータスから応答データを取得します
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 !');
}
}
これには、変数に設定されているseridもあります。その後、getUserInfo funcが呼び出され、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);
}
);
}
seridを引数として渡した後、関数はseridに関連するすべての情報をフェッチします。注:私の場合、メールでのみユーザーを記録できる機能を実行できるように、メールを探していました。
//メールでログイン
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 !');
}
});
}
プロファイル内の電子メールは、拡張アクセス許可を使用して取得できますが、fbへのログインに使用する電子メールを取得することはできません。私のアプリでは、ユーザーの複数のFBアカウントをリストに表示したい、FBアカウントのログインメールをそれぞれのアカウントの一意の識別子として表示したいが、FBから取得できなかったユーザープロファイルのプライマリメールですが、私の場合、ログインメールとプライマリメールは異なります。
は現在ログインしているユーザーに関する情報を提供しますが、oauthトークンを提供する必要があります。見る:
Facebookアプリケーションが公開されていることを確認してください。メール、public_profile、user_friendsのデータを受信するには、アプリを一般公開する必要があります。
開発目的で後から無効にして、電子メールフィールドを取得できます。
APIのバージョン番号を、"v2.11"
ではなく、"2.11"
などのように完全に指定してください。
これが正しくない場合のデフォルト値はわかりませんが、v
を忘れたときにメールを取得しようとすると、奇妙なエラーが発生しました。
次のツールは、開発中に役立ちます。
アクセストークンデバッガー:詳細については、アクセストークンに貼り付けてください
https://developers.facebook.com/tools/debug/accesstoken/
Graph API Explorer:アクセストークンを貼り付けた後、グラフAPIへのテストリクエスト