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


87

Graph API를 사용하고 있지만 로그인 한 사용자 이메일 주소를 얻는 방법을 알 수 없습니다.

Graph 소개에는 "Graph API는 이름, 이메일 주소, 프로필 사진 및 생일을 포함하여 사이트에 대한 가입 양식에서 일반적으로 요청하는 모든 기본 계정 등록 데이터에 대한 액세스를 제공 할 수 있습니다."

모두 훌륭하지만 그 정보에 어떻게 액세스합니까?

이것이 내가 지금까지 가지고있는 것입니다.

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

$first = $json['first_name']; // gets first name
$last = $json['last_name'];

3
무엇을 var_dump($obj);출력합니까?
Jayrox

답변:


78

사용자 이메일 주소를 얻는 유일한 방법은 이메일 필드에 대한 확장 권한을 요청하는 것입니다. 사용자가이를 볼 수 있도록 허용해야하며 사용자 친구의 이메일 주소를 가져올 수 없습니다.

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

Facebook 연결을 사용하는 경우 인증 대화 상자에 대한 호출의 get 문자열에 scope = email을 전달하여이를 수행 할 수 있습니다.

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


좋습니다. file_get_contents를 변경했습니다. 그러나 나는 req_perms = email을 어디로 전달할 것인지에 대해 약간 혼란스러워합니다.
kylex

10
신경 쓰지 마세요. $ facebook-> getLoginUrl (array ( 'req_perms'=> 'email'))
kylex

14
당신은 자바 스크립트 API를 사용하는 경우이 답변에 따라 나에게 완전히 명확하지 않았다 ... 당신이 사용하고자하는FB.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']
);

2
/me경로를 설명하는 참조 페이지가 있습니까? 나는의 페이지 탐색 계속 그래프 API를 :( 어디서나 찾을 수 없습니다
라두 Murzea

3
/ 나 로케일 = ko 페이지 & 필드 = 이름, 이메일 있었다 나는 그것이 이메일 주소를 반환받을 알아낼 수 온라인이에 대한 다른 참조를 찾을 수있는 유일한 방법은?
애슐리


1
이것은 정답이지만 더 간단한 설명은 여기에서 찾을 수 있습니다. stackoverflow.com/questions/37349618/…
HoldOffHunger

이것에 대해 감사합니다 .. 이것 외에는 아무것도 작동하지 않았습니다. 이제 잘 작동합니다! :)
supersan

19

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

6

사용자 이메일을 받으려면 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어레이 에서 이메일을 찾을 수 있습니다 .

도움이 되길 바랍니다!


6

상태 반환시 이러한 코드 블록을 추가하고 쿼리 문자열 개체 {} 전달을 시작하면됩니다. 자바 스크립트 개발자 용

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

이것은 또한 변수로 설정되는 사용자 ID 를 가지고 있으며 , Graph-api를 사용하여 사용자 정보를 가져 오기 위해 getUserInfo func가 호출됩니다.

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

사용자 ID 를 인수로 전달한 후 함수는 해당 사용자 ID 와 관련된 모든 정보를 가져옵니다. . 참고 : 제 경우에는 이메일을 통해서만 사용자를 로그인 할 수있는 기능을 실행할 수 있도록 이메일을 찾고있었습니다.

// 이메일을 통해 로그인

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

안녕하세요 @Pang, 이제 확인할 수 있습니다. 도움이 될 것 같습니다. 하지만 더 나은 방법은 여전히 ​​더 많은 문제를 언급 할 수 있습니다.
Delino

+ hero status, 문서에 지정되지 않은 '/'+ userId + '/? fields = id, name, email'전용
therightstuff

5

로그인 한 사용자의 프로필에서 이메일 주소를 검색 할 수 있습니다. 다음은 코드 스 니펫입니다.

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

4
이것은 나를 위해 작동하지 않습니다. $user_profile하지 않습니다 포함 이메일
블랙 비어드 데이빗

3

사용자가 앱에서 로그인 할 때 이메일 권한을 요청했고 유효한 토큰이 있다고 가정하면,

가져 오기 API를

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

결과는 다음과 같습니다.

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

어쨌든 이드가 반환됩니다.

필드 쿼리 매개 변수에 더 많은 항목을 추가 할 수 있지만 공개 프로필에없는 경우 권한이 필요합니다 (이름이 공개 임).

?fields=name,email,user_birthday&token=

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


필요하지 않은 SDK 사용을 가정하지 않는 답변을 좋아하십시오.
Lilleman


1

프로필의 이메일은 확장 권한을 사용하여 얻을 수 있지만 fb에 로그인하는 데 사용되는 이메일을 얻을 수는 없습니다. 내 앱에서 사용자의 여러 fb 계정을 목록에 표시하고 싶었고 fb 계정의 로그인 이메일을 각 계정의 고유 식별자로 표시하고 싶었지만 fb에서 가져올 수 없었습니다. 사용자 프로필의 기본 이메일이지만 내 경우에는 로그인 이메일과 기본 이메일이 다릅니다.


0

Facebook 애플리케이션이 게시되었는지 확인하십시오. 이메일, public_profile 및 user_friends에 대한 데이터를 받으려면 앱을 공개해야합니다.

나중에 개발 목적으로 비활성화하고 이메일 필드를 얻을 수 있습니다.



0

API의 버전 번호를 다음과 같이 완전히 지정해야합니다. "v2.11" 하지"2.11"

이것이 정확하지 않은 경우 기본값이 무엇인지 잘 모르겠지만 .NET Framework를 놓쳤을 때 이메일을 검색하려고하면 이상한 오류가 발생했습니다 v.


0

나에게 PHP 측 (getGraphUser () 메소드)에서 사용자의 이메일 주소를 수집하는 문제는 facebook-rendered 버튼 (WebSIDE 측에서 xfbml = 1로 생성됨)의 기본 동작이 FB.login () 호출을 암시하는 것입니다. "이메일"을 포함하지 않는 범위.

즉, 다음을 수행해야합니다.

1) 전화

FB.login (...., {범위 : 이메일})

분명히, 로그인 프로세스를 시작하기 위해 자신의 버튼을 생성

또는

2) xfbml 버튼에 scope = "email"속성 추가

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

PHP 측에서 이메일 주소를 수집 할 수 있습니다.

도움이 되었기를 바랍니다.


0

먼저 Facebook 개발자 센터 에서 애플리케이션을 활성화합니다 . 개발 모드의 애플리케이션은 이메일 필드를 검색 할 수 없습니다.

사용자가 로그인하지 않은 경우 로그인하여 응용 프로그램 / 사이트에 이메일 필드가 필요함을 지정해야합니다.

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

그런 다음 로그인 후 또는 사용자가 이미 로그인 된 경우 Facebook API를 사용하여 이메일 필드를 지정하여 이메일을 검색합니다.

FB.api('/me', {fields: 'name,email'}, (response) => {
    console.log(response.name + ', ' + response.email);
    console.log('full response: ', response);
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.