繁体   English   中英

Facebook Graph API,如何获取用户电子邮件?

[英]Facebook Graph API, how to get users email?

我正在使用 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 连接,您可以通过在调用的获取字符串中传递 scope=email 到身份验证对话框来执行此操作。

我建议使用SDK而不是 file_get_contents,因为它可以更轻松地执行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'));
}

只需在状态返回时添加这些代码块,并开始传递查询字符串对象 {}。 对于 JavaScript 开发者

初始化sdk后。

step 1: // 获取登录状态

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

这将检查文档加载并获取您的登录状态检查用户是否已登录。

然后调用函数checkLoginState ,并将响应传递给statusChangeCallback

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

第二步:让你从状态中获取响应数据

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函数以使用 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 帐户登录用户。 为此使用 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数组中找到电子邮件。

希望有帮助!

假设您在用户从您的应用登录时请求了电子邮件权限,并且您拥有有效的令牌,

使用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。

您可以向字段查询参数添加更多内容,但如果它们不在公共配置文件中(名称为 public),则您需要它们的权限。

?fields=name,email,user_birthday&token=

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

您可以从登录用户的个人资料中检索电子邮件地址。 这是代码片段

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

首先,在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);
});

可以使用扩展权限获得个人资料中的电子邮件,但我猜不可能获得用于登录 fb 的电子邮件。 在我的应用程序中,我想在列表中显示用户的多个 fb 帐户,我想将 fb 帐户的登录电子邮件显示为相应帐户的唯一标识符,但我无法从 fb 中删除它,我得到的只是用户个人资料中的主要电子邮件,但在我的情况下,我的登录电子邮件和我的主要电子邮件不同。

https://graph.facebook.com/me

将为您提供有关当前登录用户的信息,但您需要提供 oauth 令牌。 见:

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

确保您的 Facebook 应用程序已发布。 为了接收电子邮件、public_profile 和 user_friends 数据,您的应用必须公开。

您可以稍后出于开发目的禁用它,但仍然可以获取电子邮件字段。

以下工具在开发过程中很有用:

访问令牌调试器:粘贴访问令牌以获取详细信息

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

Graph API Explorer:在粘贴访问令牌后测试对图形 API 的请求

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

确保将 API 的版本号完全指定为"v2.11"而不是"2.11"

如果这是不正确的,我不确定它的默认值是什么,但是当我错过了v时,我在尝试检索电子邮件时遇到了一些奇怪的错误。

对我来说,在 PHP 端(getGraphUser() 方法)收集用户电子邮件地址的问题是,facebook 渲染按钮(在 WEBSIDE 端,使用 xfbml=1 创建)的默认行为是隐式调用 FB.login()范围不包括“电子邮件”。

这意味着您必须:

1) 打电话

FB.login(....,{scope: email})

显然,创建自己的按钮来开始登录过程

2) 将 scope="email" 属性添加到 xfbml 按钮

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

能够在 PHP 端收集电子邮件地址。

希望它有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM