developer tip

Facebook Graph API, 사용자 이메일을받는 방법?

copycodes 2020. 9. 24. 07:58
반응형

Facebook Graph API, 사용자 이메일을받는 방법?


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을 전달하여이를 수행 할 수 있습니다.

Oauth 인증 을 훨씬 쉽게 수행 할 수 있도록 file_get_contents 대신 SDK사용하는 것이 좋습니다 .


// 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 열기 함수에 Access_token 추가 getLoginUrl()

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"]);
    }
?>

Just add these code block on status return, and start passing a query string object {}. For JavaScript devs

After initializing your sdk.

step 1: // get login status

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

This will check on document load and get your login status check if users has been logged in.

Then the function checkLoginState is called, and response is pass to statusChangeCallback

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

Step 2: Let you get the response data from the status

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

This also has the userid which is being set to variable, then a getUserInfo func is called to fetch user information using the 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);
      }
    );
  }

After passing the userid as an argument, the function then fetch all information relating to that userid. Note: in my case i was looking for the email, as to allowed me run a function that can logged user via email only.

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

https://graph.facebook.com/me

will give you info about the currently logged-in user, but you'll need to supply an oauth token. See:

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


The email in the profile can be obtained using extended permission but I Guess it's not possible to get the email used to login fb. In my app i wanted to display mulitple fb accounts of a user in a list, i wanted to show the login emails of fb accounts as a unique identifier of the respective accounts but i couldn't get it off from fb, all i got was the primary email in the user profile but in my case my login email and my primary email are different.


Make sure your Facebook application is published. In order to receive data for email, public_profile and user_friends your app must be made available to public.

You can disable it later for development purposes and still get email field.


The following tools can be useful during development:

Access Token Debugger: Paste in an access token for details

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

Graph API Explorer: Test requests to the graph api after pasting in your access token

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


Make sure to fully specify the version number of the API as something like "v2.11" and not "2.11"

I'm not sure what it defaults to if this is incorrect, but I got some odd errors trying to just retrieve the email when I missed the v.


Assuming you've requested email permissions when the user logged in from your app and you have a valid token,

With the fetch api you can just

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

result will be:

{
    "id": "some_id",
    "email": "name@example.org"
}

id will be returned anyway.

You can add to the fields query param more stuff, but you need permissions for them if they are not on the public profile (name is public).

?fields=name,email,user_birthday&token=

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

참고URL : https://stackoverflow.com/questions/3611682/facebook-graph-api-how-to-get-users-email

반응형