簡體   English   中英

PHP-SDK Facebook身份驗證不斷重定向

[英]PHP-SDK Facebook auth keeps redirecting

我正在嘗試將Facebook集成到我正在開發的Web應用程序中。 我從Facebook獲得了api密鑰和秘密密鑰,並將站點網址設置為http://www.mysite.com/something/app/

來自http://www.mysite.com/something/app/signup/xxxx/的以下代碼用於檢測用戶是否已連接:

        $facebook = new Facebook(array(
          'appId'  => FB_APIKEY,
          'secret' => FB_SECRETKEY,
          'cookie' => true  
        ));

        $session = $facebook->getUser();

        if($session) {
            # Active session, let's try getting the user id (getUser()) and user info (api->('/me'))
            try{
                $uid = $facebook->getUser();
                $user = $facebook->api('/me');
            } catch (Exception $e){}

            if(!empty($user)){
                # User info ok? Let's print it (Here we will be adding the login and registering routines)
                echo $user;
            } else {
                # For testing purposes, if there was an error, let's kill the script
                die("There was an error.");
            }
        } else {
            # There's no active session, let's generate one
            $login_url = $facebook->getLoginUrl();
            header("Location: ".$login_url);
        }

但是問題是,當用戶被重定向到$ login_url時,它將不斷地向后重定向,從而形成無限循環。

重定向網址為: https : //www.facebook.com/connect/uiserver.php?app_id=xxxxxxxxxxx&method=permissions.request&display=page& next=http% 3A% 2F%2Fwww.something.com%2Fsomething%2Fapp%2Fsignup% 2Fxxxxx %2F&RESPONSE_TYPE =代碼&狀態= 6f51768c22974a16b5dcf4d8dc7f46df&fbconnect = 1

我在SO上以及Google上都看過其他類似的問題,並嘗試過他們的解決方案,但這並沒有幫助我。

[UPDATE]

好吧,我想我正在做某事。 如果我以其他Facebook用戶身份登錄,則不會被循環重定向。 似乎只有當我使用自己的Facebook帳戶(該應用程序的管理員)時才會發生。 但是在重定向之后,它應該正確返回getUser()。但是由於某種原因,它沒有。

有任何想法嗎? 謝謝。

我從服務器的根目錄開始從一個新的.php文件開始。 一切正常,所以我發現自己的代碼導致網頁重定向。

實際上,正是我的.htaccess文件中的mod_rewrite弄得一團糟。 不知何故,它沒有選擇FB設置的GET變量。 所以我需要弄清楚一些東西。 但是至少我現在知道是什么原因引起的。 結案!

我剛遇到同樣的問題。 當我嘗試使用與當前服務器中的另一台服務器相同的代碼(最新的FB SDK)時,發生了無限重定向循環。

當我開始調試它時,我發現原因是因為當前服務器$_REQUEST似乎$_REQUEST $_GET中的值。 因此, $_GET['state']$_GET['code']都不會在$_REQUEST讀取。 base_facebook.php ,似乎他們使用$_REQUEST而不是$_GET來獲取代碼和狀態值。

因此,對此的簡單解決方法是包括以下代碼:

$_REQUEST['state'] = $_GET['state'];
$_REQUEST['code'] = $_GET['code'];

在facebook SDK文件的require_once之前。

希望這會幫助一些人!

我在這里遇到同樣的問題。 這是一個簡單的代碼,它在單個站點上運行,並且非常簡單:

@ini_set('log_errors','On'); // enable or disable php error logging (use 'On' or 'Off')
@ini_set('display_errors','On'); // enable or disable public display of errors (use 'On' or 'Off')
include_once('lib/facebook.php');

// Create our application instance
$config = array(
  'appId' => 'xx',
  'secret' => 'yyy'
);
$link = 'http://someurl.com';
$facebook = new Facebook($config);

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

if($user){ ?>
    <p>logged in</p>
<?php } else {
    $loginUrl = $facebook->getLoginUrl(array(
    'scope'         => 'manage_pages,email',
    'redirect_uri'  => $link,
    ));
    echo '<a href="'.$loginUrl.'">Login with FB</a>'; 
}

所以id會做什么,它會顯示用戶未登錄時登錄的鏈接(或者是特定的-如果getUser()無法接收任何內容),以及帶有文本的段落(如果getUser給出了應提供的內容)。

簡單的測試將顯示一個問題。 即使授予用戶權限,通過站點url訪問它也會顯示登錄URL而不是段落。

問題出在哪兒? 在嘗試弄清楚時,我將網站的網址添加為“ Facebook上的應用”,以便可以從Facebook內部訪問它。 還有eureka,如果通過這種方式(通過Canvas Page url)進行訪問,則getUser()可以正常工作。 更重要的是,一旦您通過“畫布頁面” URL鏈接進行了訪問,然后直接訪問了站點,則getUser()也可以正常工作。

那么漁獲量在哪里? 嘗試使用瀏覽器的隱身功能時,我已經想到otu,用戶瀏覽器中存儲了一些內容。 直接從瀏覽器訪問網站(用戶已經在“畫布頁面” URL上)顯示正確的響應,而在瀏覽器上用戶沒有訪問“畫布頁面” URL時,顯示登錄URL。

因此,它暗示了問題是與瀏覽器緩存有關,Facebook在訪問整個頁面而不是Canvas頁面本身時未設置正確的方式。

有人有一個想法如何糾正僅與php sdk一起使用的問題嗎?

編輯也,當給應用程序訪問權限時,當用戶單擊登錄鏈接時,重定向將以狀態和代碼作為_GET參數返回到原始頁面。

您似乎正在使用舊版本的PHP SDK,並且該代碼應與最新版本一起使用。 將PHP SDK升級到最新版本-v3.1.1

https://github.com/facebook/php-sdk

然后該代碼應該起作用。


您是否嘗試過指定重定向uri:

<?php
    $loginUrl = $facebook->getLoginUrl(
        array( 'redirect_uri' => 'http://www.mysite.com/something/app/' )
    );
?>

目標網址后面的腳本需要創建一個Facebook對象實例,以使用戶會話持久化。

我在某些瀏覽器上遇到了這個問題,最終由於阻止站點設置的cookie以及會話而導致了瀏覽器故障。

嘗試將其添加到您的頁面:

header('P3P: CP="CAO PSA OUR"');

(它是PHP,您也可以通過HTML在meta標記上執行此操作)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM