programing

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

copysource 2022. 9. 15. 23:46
반응형

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 Connect를 사용하는 경우 호출의 get 문자열에 있는 scope=email을 Auth Dialog로 전달하여 이 작업을 수행할 수 있습니다.

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을 엽니다. Add function php function함 、 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'));
}

상태 반환 시 이러한 코드 블록을 추가하고 쿼리 문자열 개체 {} 전달을 시작하십시오.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 !');
    }
  }

또한 이 userid는 변수로 설정되며 getUserInfo 펑크가 호출되어 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);
      }
    );
  }

userid를 인수로 전달하면 함수는 해당 userid와 관련된 모든 정보를 가져옵니다.주의: 제 경우 이메일을 찾고 있었습니다.이메일만으로 사용자를 기록할 수 있는 기능을 실행할 수 있도록 하기 위해서입니다.

// 이메일로 로그인

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

이메일을 .email허가.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_profilemanager.manager로 하다

도움이 되었으면 좋겠다!

로그인한 사용자의 프로파일에서 이메일 주소를 검색할 수 있습니다.여기 코드 조각이 있습니다.

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

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

fetch 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"
}

id는 반환됩니다.

필드에 쿼리 매개 변수를 추가할 수 있지만 공용 프로필에 없는 경우(이름은 공용) 해당 매개 변수에 대한 권한이 필요합니다.

?fields=name,email,user_birthday&token=

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

먼저 Facebook Developer Center에서 어플리케이션을 활성화합니다.개발 모드의 애플리케이션은 전자 메일필드를 취득할 수 없습니다.

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

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

https://graph.facebook.com/me

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

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

프로파일의 이메일은 확장 권한을 사용하여 취득할 수 있지만 fb 로그인에 사용하는 이메일은 취득할 수 없는 것 같습니다.제 앱에서는 사용자의 여러 fb 계정을 목록으로 표시하고 싶었고, 각 계정의 고유 식별자로 fb 계정의 로그인 메일을 표시하고 싶었지만 fb에서 지울 수 없었습니다.사용자 프로파일의 프라이머리 메일뿐이었습니다만, 로그인 메일과 프라이머리 메일은 다릅니다.

Facebook 어플리케이션이 공개되어 있는지 확인합니다.이메일, public_profile 및 user_friends 데이터를 수신하려면 앱을 공개해야 합니다.

나중에 개발 목적으로 사용하지 않도록 설정해도 전자 메일 필드를 계속 사용할 수 있습니다.

개발 중에 도움이 될 수 있는 툴은 다음과 같습니다.

액세스 토큰 디버거: 자세한 내용을 보려면 액세스 토큰에 붙여넣기

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

그래프 API 탐색기:액세스 토큰에 붙여넣은 후 그래프 API에 대한 요청을 테스트합니다.

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

API 버전 번호를 다음과 같이 완전히 지정하십시오."v2.11"가 아니라"2.11"

잘못된 경우 기본값이 무엇인지 알 수 없습니다. 그러나 이메일을 검색하려고 할 때 몇 가지 이상한 오류가 발생했습니다.v.

PHP측(getGraphUser() 메서드)에서 사용자의 이메일 주소를 수집할 때의 문제는 (WEBSIDE측에서 xfbml=1로 작성된) 기본 동작은 "email"을 포함하지 않는 스코프로 FB.login()을 호출하는 것입니다.

즉, 다음과 같습니다.

1) 전화


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

로그인 프로세스를 시작하기 위한 자체 버튼 만들기

또는

2) xfbml 버튼에 scope="email" 속성을 추가합니다.


<div class="fb-class-button" data-size="large" data-button-type="class_with" data-layout="data-auto-logout-link="false" data-use-as-as-true" data-width="1000px" scope="email"></div>

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

도움이 됐으면 좋겠다.

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

반응형