복붙노트

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

PHP

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

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

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

모두 좋고 좋지만 어떻게 정보에 액세스합니까?

이것은 내가 지금까지 가지고있는 것이다 :

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

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

해결법

  1. ==============================

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

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

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

    Auth Dialog에 전화 걸기 문자열에 scope = email를 전달하여 Facebook 연결을 사용하는 경우이 작업을 수행 할 수 있습니다.

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

  2. ==============================

    2.

    // 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']
    );
    
  3. ==============================

    3.Open base_facebook.php getLoginUrl () 함수에 Access_token을 추가하십시오.

    Open 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'));
    }
    
  4. ==============================

    4.사용자 이메일을 받으려면 이메일 권한을 사용하여 Facebook 계정으로 로그인해야합니다. 페이스 북 PHP SDK (github 참고)를 다음과 같이 사용하십시오.

    사용자 이메일을 받으려면 이메일 권한을 사용하여 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;
        }
    }
    

    그가 아니라면 이메일 권한을 묻는 로그인 링크를 표시 할 수 있습니다.

    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 배열에서 찾을 수 있습니다.

    희망이 도움이됩니다!

  5. ==============================

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

    6.https://graph.facebook.com/me

    https://graph.facebook.com/me

    현재 로그인 한 사용자에 대한 정보를 제공하지만 oauth 토큰을 제공해야합니다. 만나다:

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

  7. ==============================

    7.프로필의 이메일은 확장 된 권한을 사용하여 얻을 수 있지만 로그인 fb에 사용 된 이메일을받을 수 없다고 생각합니다. 내 애플 리케이션에서 나는 목록에있는 사용자의 다중 fb 계정을 표시하고 싶었지만 각 계정의 고유 식별자로 fb 계정의 로그인 전자 메일을 표시하려고했지만 fb에서 꺼낼 수 없었습니다. 사용자 프로필의 기본 이메일이지만 내 경우 로그인 이메일과 기본 이메일이 다릅니다.

    프로필의 이메일은 확장 된 권한을 사용하여 얻을 수 있지만 로그인 fb에 사용 된 이메일을받을 수 없다고 생각합니다. 내 애플 리케이션에서 나는 목록에있는 사용자의 다중 fb 계정을 표시하고 싶었지만 각 계정의 고유 식별자로 fb 계정의 로그인 전자 메일을 표시하려고했지만 fb에서 꺼낼 수 없었습니다. 사용자 프로필의 기본 이메일이지만 내 경우 로그인 이메일과 기본 이메일이 다릅니다.

  8. ==============================

    8.Facebook 응용 프로그램이 게시되었는지 확인하십시오. email, public_profile 및 user_friends에 대한 데이터를 받으려면 앱을 공개해야합니다.

    Facebook 응용 프로그램이 게시되었는지 확인하십시오. email, public_profile 및 user_friends에 대한 데이터를 받으려면 앱을 공개해야합니다.

    나중에 개발 목적으로 사용 중지하고 이메일 필드를 계속 사용할 수 있습니다.

  9. ==============================

    9.개발 중에 다음 도구가 유용 할 수 있습니다.

    개발 중에 다음 도구가 유용 할 수 있습니다.

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

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

  10. ==============================

    10.API의 버전 번호를 "2.11"이 아닌 "v2.11"과 같이 지정하십시오.

    API의 버전 번호를 "2.11"이 아닌 "v2.11"과 같이 지정하십시오.

    이것이 올바르지 않다면 무엇이 기본값인지 확신 할 수 없지만 v를 놓친 이메일을 검색하려고하는 이상한 오류가 발생합니다.

  11. ==============================

    11.상태 반환시이 코드 블록을 추가하고 쿼리 문자열 개체 {}를 전달하기 만하면됩니다. JavaScript 개발자 용

    상태 반환시이 코드 블록을 추가하고 쿼리 문자열 개체 {}를 전달하기 만하면됩니다. 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 !');
        }
      }
    

    여기에는 또한 변수로 설정된 사용자 ID가 있으며, 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);
          }
        );
      }
    

    인수로 사용자 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 !');
          }
        });
      }
    
  12. from https://stackoverflow.com/questions/3611682/facebook-graph-api-how-to-get-users-email by cc-by-sa and MIT license