0

これまでのところ、基本的なユーザー情報を取得するように設定していますが、何も拡張されていません。ユーザーの電子メールも取得しようとしていますが、成功しません。これが私が得たものです:

   $facebook = new Facebook(array(
            'appId' => APP_ID,
            'secret' => APP_SECRET,
            'cookie' => true,

        ));

$session = $facebook->getSession();

if (!empty($session)) {
    try {
    $params = array(
      'scope' => 'email',
      'redirect_uri' => 'https://www.dormduels/splash_test'
    );

    $loginUrl = $facebook->getLoginUrl($params);
        $uid = $facebook->getUser();

         $access_token = $facebook->getAccessToken();

        echo $access_token;
        $user = $facebook->api('me?fields=name,first_name,last_name,username,email&access_token='.$access_token);
        echo "<pre>";
        print_r($user);
        exit();

問題は。facebooksグラフエクスプローラーでテストしたときに表示されるgetAccessTokenは、電子メールのような拡張データを表示せず、基本的なもののみを表示します。より多くのパーミッション対応のアクセストークンをリクエストするにはどうすればよいですか?

4

3 に答える 3

1

私の側では、私はそれをこのようにします:

// Create our Application instance (replace this with your appId and secret).
$facebook = new Facebook(array(
  'appId'  => FB_API_KEY,
  'secret' => FB_API_SECRET,
));

// Get User ID
$fb_user = $facebook->getUser();

// We may or may not have this data based on whether the user is logged in.
//
// If we have a $fb_user id here, it means we know the user is logged into
// Facebook, but we don't know if the access token is valid. An access
// token is invalid if the user logged out of Facebook.
if ($fb_user) {
  try {
    // Proceed knowing you have a logged in user who's authenticated.
    $fb_user_profile = $facebook->api('/me');
  } catch (FacebookApiException $e) {
    error_log($e);
    $fb_user = null;
  }
}

// Login or logout url will be needed depending on current user state.
if ($fb_user) {
    $fb_loggedin = true;
} else {
    $fb_loggedin = false;
    $fb_loginUrl = $facebook->getLoginUrl(array(
        'scope' => 'email,user_location',
        'redirect_uri' => 'http://'.$_SERVER['HTTP_HOST'].'/debut_'.($lang == 'fr' ? 'fr' : 'eng').'.php'
    ));
}

getLoginUrlのSCOPEは、見たいものです。開発者サイトのさまざまな権限をすべて確認できます。

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

幸運を

于 2012-07-17T19:46:55.307 に答える
1

次のいずれかの方法で、拡張アクセス許可、つまりここでの「電子メール」を要求する必要があります。

  1. php sdk

    sdkオブジェクトのgetLoginUrl()メソッドを使用し、「スコープ」で必要な拡張権限を指定して、ユーザーをその戻り値にリダイレクトします。また、Facebookアプリの管理ページにドメインとサイトのURLを追加する必要があります。次に例を示します。

    define('APP_ID', 'TODO FILL IT WITH YOURS');
    define('APP_SECRET', 'TODO FILL IT WITH YOURS');
    
    require_once 'facebook.php';
    
    function redirect_to_login($fb){
        $login_url = $fb->getLoginUrl(array(
            'scope' => 'email',
        ));
        header('Location: '.$login_url);
        exit;
    }
    
    $fb = new Facebook(array(
        'appId' => APP_ID,
        'secret' => APP_SECRET,
        'cookie' => true,
    ));
    
    $uid = $fb->getUser();
    if (!$uid || !check_perms($fb, $uid, array('email'))) { // see check_perms below
        // send users to login/auth page if they are not logged in, 
        // or not installed the app, 
        // or don't have all the perms we need
        redirect_to_login($fb);
    }
    
    try {
        $me = $fb->api('/me');
        var_dump($me);
    } catch (Exception $e) {
        redirect_to_login($fb);
    }
    
  2. js sdk

    2番目のパラメーターで、 FB.login()関数を使用して、必要な拡張アクセス許可を要求します。

認証プロセス全体の詳細については、このページを参照してください。

現在のユーザーが必要なすべての権限を持っているかどうかを確認する場合は、次のようにFQLを使用できます。

function check_perms($facebook, $uid, $perms = array()) {

    $perms_str = join(' = 1 and ', $perms).' = 1';
    $query = "select uid from permissions where uid = '".$uid."' and ".$perms_str;

    try {
        $row = $facebook->api(array(
            'method' => 'fql.query',
            'query'  => $query,
        ));
        return $row && $row[0]['uid'] == $uid;
    } catch (Exception $e) {
        return false;
    }
}

注:php sdkのバージョンはおそらく古くなっています 。getSession ()メソッドは廃止され、getUser()/ getAccessToken()が採用されました。

于 2012-07-17T19:44:41.353 に答える