2012-08-30 5 views
8

tôi cố gắng để mở rộng tồn tại lâu dài thẻ truy cập vớiBắt thẻ truy cập tồn tại lâu dài với setExtendedAccessToken() trả về ngắn sống thẻ

$facebook->setExtendedAccessToken(); 
$access_token = $facebook->getAccessToken(); 

Sau khi xem SDK Tôi thấy rằng setExtendedAccessToken() chức năng được thiết lập tồn tại lâu dài access token trong

protected static $kSupportedKeys = 
array('state', 'code', 'access_token', 'user_id'); 

với

$this->setPersistentData(
    'access_token', $response_params['access_token'] 
); 

và getAccessToken() đang trả lại mã thông báo truy cập trong thời gian ngắn từ

protected $accessToken 

vì vậy mục đích của setExtendedAccessToken() vì nó không trả lại bất kỳ điều gì?

+0

Tôi cũng hy vọng rằng ai đó có thể đưa ra bất cứ câu trả lời hữu ích cho câu hỏi đó. –

Trả lời

12

@Julian. Cảm ơn bạn rất nhiều vì nguồn cảm hứng ở đây. Tôi đã có thể thực hiện công việc này mà không thay đổi bất kỳ tệp FB api lõi nào.

Điều gì xảy ra là, cuộc gọi setExtendedAccessToken sẽ gửi giá trị đến setPersistentData, sau đó gửi nó vào phiên qua constructSessionVariableName.

Vì vậy, nếu chúng tôi thoát khỏi phiên, sau đó đặt nó vào đối tượng facebook, chúng tôi đã sẵn sàng.

Đây là mã của tôi:

// ask for the extended token and get it from session ... 
$facebook->setExtendedAccessToken(); 
$access_token = $_SESSION["fb_".FB_APP_ID."_access_token"]; 
// now set it into the facebook object .... 
$facebook->setAccessToken($access_token); 
// now our fb object will use the new token as usual ... 
$accessToken = $facebook->getAccessToken(); 
+0

Rất tốt, cảm ơn bạn đã giải quyết vấn đề này! Mừng vì tôi có thể giúp. –

+0

Bạn có phiên bản trình duyệt chéo cho điều này không? phiên đó không được thiết lập đôi khi, ví dụ sử dụng Mac OSX Opera – Davit

5

Sau khi nỗ lực hơn nữa để poke xung quanh base_facebook.php, tôi đã khám phá ra những điều sau đây:

  • setExtendedAccessToken(); sẽ trao đổi một truy cập ngắn ngủi token và Facebook sẽ trả về một thẻ truy cập mở rộng thích hợp.
  • setExtendedAccessToken(); lưu điều này trong bộ nhớ cache dữ liệu liên tục, nhưng điều này không có nghĩa là getAccessToken(); có thể truy cập vào nó, vì getAccessToken(); không truy vấn bộ nhớ cache liên tục. Hơn nữa, lớp dường như coi dữ liệu liên tục là "không an toàn" và chỉ sử dụng dữ liệu nếu tất cả các nỗ lực truy xuất dữ liệu khác không thành công (nghĩa là sau khi kiểm tra signed_request và phân tích cú pháp code).
  • Trong trường hợp của chúng tôi, mã thông báo truy cập được trả lại qua setExtendedAccessToken(); là mã thông báo truy cập gần đây nhất, vì vậy tôi đã bị hack. Thêm dòng sau vào dưới cùng của setExtendedAccessToken();

    // Also set the publically accessible access token value to this new extended token

    $this->accessToken = $response_params['access_token'];

  • Caveat: Mặc dù bây giờ chúng tôi có thẻ truy cập mở rộng mới, truy vấn tiếp theo lên Facebook để lấy một thẻ truy cập (ví dụ sau khi làm mới trang) sẽ trả về cùng một mã thông báo truy cập tồn tại ngắn. * facepalm *

  • Ngay cả sau khi người dùng đăng xuất (do đó gây ra mã thông báo ngắn hạn hết hạn) và đăng nhập lại, Facebook sẽ lại trả về mã thông báo truy cập ngắn.
  • Tuy nhiên, mặc dù trường hợp này xảy ra, setExtendedAccessToken(); sẽ trả về cùng một mã thông báo truy cập mở rộng mà bạn đã truy xuất trước đó. Mã thông báo này vẫn có thể sử dụng để truy vấn thông tin người dùng.

Vì vậy, điều này trông giống như lỗi Facebook, nhiều như tôi ghét nói điều đó. Chúng tôi có thể giải quyết vấn đề với thông tin chi tiết ở trên và mọi cuộc gọi tiếp theo để tìm nạp mã thông báo truy cập sẽ chỉ trả về mã thông báo truy cập ngắn, có thể trao đổi lại cho cùng một mã thông báo truy cập mở rộng.


gốc trả lời

Theo this answer, các thẻ truy cập mới được lưu trong dữ liệu liên tục (như bạn cũng đã chỉ ra trong câu hỏi của bạn), và có thể được truy cập thông qua $facebook->getAccessToken();.

Hai lưu ý liên quan:

  • This page cũng đề cập rằng khi thẻ truy cập ngắn ngủi được trao đổi cho một thẻ truy cập mở rộng, token tự có thể hoặc có thể không thay đổi, mặc dù thời gian hết hạn nên có được cập nhật để phản ánh thời gian hết hạn lâu hơn. Có lẽ khi bạn gọi $facebook->getAccessToken();, bạn chỉ đang nhận được cùng một mã thông báo trở lại, nhưng hết hạn của nó đã thay đổi?
  • Cuộc gọi để trao đổi mã thông báo truy cập tồn tại trong thời gian ngắn cho mã mở rộng chỉ có thể được thực hiện mỗi ngày một lần cho mỗi người dùng. Tôi không biết tại sao điều này xảy ra và tôi không biết liệu bộ đếm này có được đặt lại hay không nếu người dùng quyết định hủy ủy quyền ứng dụng của bạn và ủy quyền lại.

Từ các tài liệu Facebook:

Khi người dùng truy cập trang web của bạn với một hiện có, hợp lệ, trong thời gian ngắn access_token người dùng, bạn có tùy chọn để kéo dài thời gian hết hạn mà access token. Nền tảng của chúng tôi sẽ chỉ kéo dài thời gian hết hạn một lần mỗi ngày, vì vậy ngay cả khi người dùng revists trang web của bạn nhiều lần trong ngày, mã thông báo sẽ được kéo dài lần đầu tiên được yêu cầu. (tôi nhấn mạnh)

Tôi tin rằng đây là trường hợp vì các lập trình cẩu thả sẽ gọi $facebook->setExtendedAccessToken(); tại mọi cơ hội có thể, với hy vọng luôn luôn lấy một thẻ truy cập mở rộng. (Thay vì hành vi ưa thích, sẽ chỉ gọi $facebook->setExtendedAccessToken(); nếu những gì bạn hiện có là mã thông báo truy cập ngắn - nhưng làm thế nào bạn thậm chí sẽ cho biết trừ khi bạn đã lưu ngày hết hạn, mà trong và chính nó là 't that trusted ...!)

Giả định của tôi là nếu người dùng không cho phép ứng dụng hoặc mã thông báo không hợp lệ, giới hạn sẽ đặt lại và bạn sẽ có thể truy xuất mã thông báo truy cập mở rộng khi chuyển vào mã thông báo truy cập ngắn. Tuy nhiên, điều này đòi hỏi phải kiểm tra thêm, vì vậy hãy lấy đoạn này với một hạt muối.

+0

Julian H.Lam nó dường như làm việc khi tôi không đi qua facebook chrome, có lẽ họ có nghĩa là nó để làm việc với các trang web có sử dụng facebook và không phải là các ứng dụng web được hiển thị bên trong chrome fb. – alexl