3

我有這樣的代碼:如何使用PHP SDK擴展Facebook用戶訪問令牌?

$facebook->api("/oauth/access_token?grant_type=fb_exchange_token&client_id=".$facebook->getAppId()."&client_secret=".$facebook->getAppSecret()."&fb_exchange_token=".$user->getFacebookAccessToken()); 

它不拋出任何異常,但它返回null。我試圖將一個短命的Facebook用戶訪問令牌擴展爲一個長壽命的Facebook用戶訪問令牌。但是,在生成新的令牌並在新令牌仍然存在的情況下調用此請求後,我等了幾個小時,然後啓動了瀏覽器,但未使用我的Facebook帳戶登錄。然後我用一個測試用戶(對應用程序,而不是Facebook)登錄,但不幸的是,它正在將我導向Facebook登錄,這意味着Facebook用戶訪問令牌無效。

我工作的基礎上發現文檔here

那麼,有人能告訴我該如何發送請求,這樣Facebook纔會真正延長令牌的生命週期?另外,我不知道如何確定我是否已成功延長Facebook用戶訪問令牌的生命週期。 (我不是Facebook粉絲,至少可以說,我也是Facebook API的新手)。

謝謝,夥計們。

編輯: 我已閱讀this article並將setExtendedAccessToken方法複製到我的類中,並進行了一些修改以支持我的邏輯。現在它試圖延長用戶的生命週期的Facebook訪問令牌是如下的代碼:

$facebook->setExtendedAccessToken($user->getFacebookAccessToken()); 

現在它返回兩個元素,令牌和到期日期的陣列。失效日期是「5174078」。我相信我正處在解決這個問題的正確軌道上,是嗎?

+0

一些你的問題並沒有完全意義的 - 的道理,如果正確擴展,應該保持有效約60天,到期時間應該來自令牌擴展端點的響應 - 您在哪裏存儲擴展令牌?你確定你對同一個用戶使用相同的標記,並且在沒有設置Facebook cookie的情況下,在你的PHP代碼中不意外調用getAccessToken()? – Igy

+0

好,感謝您的意見,我會嘗試爲我的問題添加更多意義。我知道擴展令牌應該長時間保持有效。我將Facebook用戶訪問令牌存儲在與用戶關聯的數據庫中,所以是的,我相信我正在爲同一用戶使用相同的訪問令牌。我相信你的到期時間應該是在迴應中,但我得到的答覆爲空,所以我認爲有些錯誤。我的問題是:如果參數是正確的,我的代碼是否能正常工作(擴展令牌並返回擴展令牌)? –

+0

當您擴展從JavaScript SDK收到的短期令牌(1-2小時有效期)時,您應該得到一個包含更新的令牌及其過期或錯誤消息的響應,如果您收到null,您可能會默默地忽略錯誤某處。您無法擴展您使用服務器端流程創建的代碼,或者擴展已交換的令牌,以防您正在嘗試執行的操作。您需要用戶在登錄FB時返回。總體而言,您應該能夠獲取和存儲令牌,然後在用戶返回時使用該令牌引導SDK('$ facebook-> setAccessToken()') – Igy

回答

4

這是我認爲你應該做的事情:

  1. 的FB用戶,登錄後,來到你的網站,你通過Javascript代碼SDK的客戶端流量得到了他們短暫的令牌或一個長期存在的令牌通過服務器端流量與PHP或其他一些SDK (看起來你已經在做第一個)
  2. 如果它是一個短暫的令牌,擴展它並得到一個長通過API調用交換令牌(看起來你也是這樣做的)
  3. 長期令牌保存到你的數據庫(不知道你這樣做)
  4. 當用戶回來您的應用程序在其他一些點,在通過自己的登錄系統,您的應用程序日誌,但沒有登錄到Facebook,您在 - > setAccessToken()中使用來自數據庫的緩存令牌,然後代表它們調用Facebook API

我認爲步驟4是您的問題;我懷疑你看到用戶已經註銷Facebook並通過Facebook auth過程再次發送它們,而不是通過你自己的登錄機制登錄到你的應用程序,並重新使用你之前存儲的令牌。

這非常好,但在這種情況下,您不需要存儲令牌,並且您可以全部「實時」執行此操作,並要求您的用戶仍然登錄到Facebook以獲取新的令牌「實時」而不是緩存您之前訪問您的應用時獲得的令牌。

+0

感謝您的回答。與此同時,我在我們的SDK版本中發現了一些錯誤,可能是一些同事的黑客攻擊。這些問題阻礙了該網站對Facebook的正確行爲。所以,這很可能是一個本地bug。但是,令牌擴展目前已停用,因爲即使短期令牌也存在問題。我會整理這些錯誤,然後回來提供更多信息。再次感謝。 –

1

正如僅供參考的原因,我在過去的45分鐘裏一直在使用令牌。通過Facebook的文檔: https://developers.facebook.com/docs/roadmap/completed-changes/offline-access-removal/

這似乎是有點過時了,我可以手動致以現有的短暫訪問令牌: https://graph.facebook.com/oauth/access_token
CLIENT_ID = APP_ID & client_secret = APP_SECRET & grant_type = fb_exchange_token & fb_exchange_token = EXISTING_ACCESS_TOKEN

+0

謝謝,這很有趣。 –