2009-06-29 38 views
57

CẬP NHẬT: Quyền đối với Facebook offline_access không được dùng nữa. Vui lòng tham khảo official documentation để biết thêm thông tin.
Bạn sẽ có đến ngày 1 tháng 5 năm 2012, tại thời điểm này, cài đặt này sẽ bị tắt . tham khảo Developer Roadmap để biết thêm thông tin.Truy cập ngoại tuyến trên Facebook từng bước


Sau khi tìm kiếm theo nghĩa đen 1 ngày trên facebook và google cho một up-to-date và làm việc cách để làm điều gì đó có vẻ đơn giản:

Tôi đang tìm kiếm một bước-by-step giải thích để có được offline_access cho một người dùng cho một ứng dụng facebook và sau đó sử dụng này (khóa phiên) để truy xuất offline & không phải trong một người bạn trình duyệt & dữ liệu hồ sơ.

Ưu tiên thực hiện việc này trong API Java Fb.

Cảm ơn.

Và có, tôi đã kiểm tra facebook wiki.

Cập nhật: Bất kỳ ai?

điều này: http://www.facebook.com/authorize.php?api_key=<api-key>&v=1.0&ext_perm=offline_access cung cấp cho tôi offline_Access, tuy nhiên cách truy xuất session_key?

Tại sao facebook không thể làm tài liệu đơn giản, tôi có nghĩa là có 600 người đang làm việc ở đó?

Câu hỏi dường như giống nhau: Getting offline_access to work with Facebook Không trả lời làm thế nào để lấy lại chốt phiên

Edit: Tôi vẫn đang bị mắc kẹt với điều đó. Tôi đoán không ai thực sự cố gắng như một truy cập hàng loạt ra chưa ...

+11

Thông thường tôi đồng ý với bạn, nhưng khi nói đến facebook hướng dẫn thường gây nhầm lẫn và mâu thuẫn. – Paul

+3

Tôi đồng ý. Người FB cần cải thiện tài liệu. Tệ hơn cả iOS và Xcode. –

Trả lời

3

Tôi biết hai giải pháp: Java và JavaScript

Java: a. mã servlet (đừng quên để nhập khẩu có liên quan jar của):

String url="http://www.facebook.com/login.php?api_key=YOUR_API_KEY&v=1.0"; 
url+="&fbconnect=true&return_session=true&req_perms=offline_access,status_update"; 
url+="&next=http://YOUR_FaceBookCallback_SERVLET"; 
response.sendRedirect(url); 
return; 

// Bạn sẽ nhận được nhắc nhở để đăng nhập vào facebook và cho phép các điều khoản mở rộng

b. Đừng quên xác định ConnectUrl của bạn (trong ứng dụng tài khoản facebook của bạn) là http://YourUrlFromWhereDoYouTurnToTheServletAbove

c. tạo một servlet khác: YOUR_FaceBookCallback_SERVLET (xem ở trên) với mã này:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
String session = request.getParameter("session"); 
//from this string you can obtain your infinite session_key.In order to do this, parse this string as JSON. 
//Save it in the database or in the other data storage 
response.sendRedirect(ThePlaceThatYouWant);} 

d. Sử dụng session_key bí mật này như thế này:

FacebookXmlRestClient client = new FacebookXmlRestClient(YOUR_API_KEY, FACEBOOK_APPLICATION_SECRET,SECRET_SESSION_KEY); 
client.setIsDesktop(false); 
client.users_setStatus("YourMessage"); 

Nếu ai đó muốn giải pháp JavaScript (lỗ lớn trong bảo mật) viết cho tôi

6

tôi đã làm một hướng dẫn không quá lâu trên blog của tôi.Nó không yêu cầu bất kỳ plugin hoặc whatnot, nó được thực hiện trong PHP, và tôi đã thử nghiệm nó. Tôi đã làm nó cho chủ yếu là bài tường, nhưng sau khi bạn xác thực bạn có thể sử dụng bất cứ chức năng nào bạn muốn.

EDIT: Bài đăng không còn tồn tại. FB API được cập nhật ...

+0

@Jon - Cảm ơn bạn đã hướng dẫn này. – JSchaefer

+0

Đừng lo lắng: D Tôi hy vọng nó giúp thiết lập một cái gì đó tuyệt vời! –

+0

Điều này sử dụng SDK PHP kế thừa của Facebook không còn hợp lệ nữa. – Quentin

2

Tôi đã tìm ra cách "truy xuất" khóa phiên vô hạn truy cập ngoại tuyến sau nhiều lần phân tách tóc, một số thử và lỗi & tự hỏi về tất cả các cách sản xuất khác mà tôi có thể đã chi tiêu thời gian đó ... tài liệu facebook đồng ý có thể tốt hơn rất nhiều

1) Nếu bạn đang sử dụng facebook-java-api .. thì hãy xem trang web giới thiệu facebook cho "web di động" về cách định dạng URL cho yêu cầu truy cập ẩn
http://itsti.me/index.php

<a href="http://www.facebook.com/connect/prompt_permissions.php?api_key=YOUR_API_KEY&ext_perm=publish_stream%2Coffline_access&next=http%3A%2F%2Fmysite%2Ffacebookconnect&cancel=http%3A%2F%2Fmysite%2Fhome&display=wap"><img alt="Connect" src="http://static.ak.fbcdn.net/images/fbconnect/login-buttons/connect_light_medium_long.gif" id="fb_login_image"/></a> 

2) Cách nhận khóa phiên ngoại tuyến từ phiên .. Bí quyết là: khi facebook chuyển hướng người dùng sang url "tiếp theo" ngay sau khi cấp quyền truy cập ngoại tuyến, bạn sẽ nhận được phiên facebook "lần nữa" .. phiên sẽ có khóa phiên vô hạn.
đây là ví dụ cho web di động ... bạn sẽ có thể tìm ra trang web thông thường. Auth_token chỉ được sử dụng cho các trang web di động .. bạn có thể không cần nó cho trang web thông thường

FacebookJsonRestClient fbc = new FacebookJsonRestClient(MY_API_KEY, SECRET, sessionKey); 
String auth_token = request.getParameter("auth_token"); 
System.out.println("infinite session kEY = " + fbc.auth_getSession(auth_token)); 
63

Với API đồ thị Facebook mới, mọi thứ trở nên đơn giản hơn một chút nhưng ít được tài liệu hơn. Đây là những gì tôi đã làm để có thể tải bài tường của tôi như tôi từ một phía máy chủ duy nhất (không nằm trong một phiên trình duyệt) php script:

  1. tạo một ứng dụng facebook, nếu bạn chưa có một có thể sử dụng cho dự án này http://www.facebook.com/developers/apps.php#!/developers/createapp.php - và đặt chế độ hộp cát/nhà phát triển! @ Advanced Settings> Sandbox Mode> Enable (Chỉ cho phép các nhà phát triển ứng dụng của bạn nhìn thấy nó.) Bạn sẽ cần ID ứng dụng (APP_ID) và Khóa bí mật (SECRET_KEY) được liệt kê trên bản tóm tắt tài khoản nhà phát triển của ứng dụng đó nhưng không Khóa API cũ.

  2. tải trong trình duyệt của bạn, đã đăng nhập vào fb như tài khoản mà bạn muốn ứng dụng phía máy chủ của bạn để kết nối như, và bấm vào nút "cho phép" cho quyền được yêu cầu: https://graph.facebook.com/oauth/authorize?client_id=APP_ID&scope=offline_access,read_stream&redirect_uri=http://www.facebook.com/connect/login_success.html

  3. sao chép "code" tham số từ chuỗi truy vấn url kết quả của, sử dụng trong: https://graph.facebook.com/oauth/access_token?client_id=APP_ID&redirect_uri=http://www.facebook.com/connect/login_success.html&client_secret=APP_SECRET&code=CODE_FROM_2 Và copy phía bên tay phải của access_token = trong văn bản kết quả trang, mà sẽ nằm trong cấu trúc của: APP_ID | HEXNUM-USER_ID | WEIRD_KEY

  4. bây giờ tải xuống từ biểu đồ api hoặc cl phần còn lại api assic bằng cách sử dụng truy cập tuyên thệ TOKEN bạn chỉ có ala (nơi SOURCE_ID là id facebook cho người sử dụng/nhóm/bất cứ điều gì mà bạn đang tìm lên):

    <?php 
    $stream = json_decode(file_get_contents("https://api.facebook.com/method/stream.get?source_ids=SOURCE_ID&access_token=ACCESS_TOKEN&format=json")); 
    var_dump($stream); 
    // this one gives a 500 internal server error from the http get if any of the fields are invalid, but only in php, not when loaded in a browser... weird. 
    $feed = json_decode(file_get_contents("https://graph.facebook.com/SOURCE_ID/feed?fields=id,from,created_time,link,type&access_token=ACCESS_TOKEN")); 
    var_dump($feed); 
    ?> 
    

Ghi nhận rằng các api đồ thị và phần còn lại api trả về không chỉ cấu trúc khác nhau, mà còn thông tin khác nhau - vì vậy ở đây, tôi thích kết quả từ phần còn lại api (cái đầu tiên) mặc dù tôi thích có thể hạn chế các trường trong api đồ thị mới (thứ hai).

Nhìn vào http://developers.facebook.com/docs/authentication/ trong phần "Yêu cầu quyền mở rộng" và "Xác thực người dùng trong ứng dụng web" cho chi tiết chính thức (thưa thớt).

Nếu bạn muốn làm điều này thường xuyên, tức là lập trình, đây là phiên bản tự động của bước 2 + 3:

Đặt này trên máy chủ web của bạn là "facebook_access_token.php":

<?php $token = explode('=', file_get_contents("https://graph.facebook.com/oauth/access_token?client_id=APP_ID&redirect_uri=http://$_SERVER[SERVER_NAME]$_SERVER[PHP_SELF]&client_secret=APP_SECRET&code=" . 
(get_magic_quotes_gpc() ? stripslashes($_GET['code']) : $_GET['code']))); 
echo $token[1]; 
// store this, the access token, in the db for the user as logged in on your site -- and don't abuse their trust! ?> 

Và hướng người dùng trực tiếp vào trình duyệt của họ tới: https://graph.facebook.com/oauth/authorize?client_id=APP_ID&scope=offline_access,read_stream&redirect_uri=http://www.example.com/facebook_access_token.php

+0

Cảm ơn sự giúp đỡ của tôi rất nhiều. – PrateekSaluja

+0

Omg chỉ là những gì tôi đã tìm kiếm trong hai ngày qua! Bạn là vị cứu tinh của tôi! – Somebody

+0

Tuyệt vời! Bạn đã cứu ngày của tôi ... –

0

Để truy cập phiên, tôi phải sử dụng loginurl được cung cấp bởi api facebook php, vì dường như có 2/3 biến bổ sung mà nó gửi trong yêu cầu xác thực, bao gồm r eturn_session và session_version. Ngoài ra, php5-sdk mới gửi yêu cầu đến login.facebook.com thay vì https://graph.facebook.com/oauth/authorize. Dưới đây là làm thế nào tôi đã làm việc nó ra:

$b=new facebook(array('appId'=>APP_ID,'secret'=>SECRET))

Để yêu cầu xác thực:

$facebook->getLoginUrl(array('next'=>$redirect_uri,'req_perms'=>$scope))

rember bao gồm offline_access trong $ phạm vi. Khi bạn được chuyển hướng đến trang này (sau khi đăng nhập vào fb và cấp quyền), bạn sẽ có một $ _GET ['phiên'] ở định dạng json.

Chỉ lưu trữ ở bất cứ nơi nào bạn muốn (tôi làm điều đó trong cơ sở dữ liệu). Lần sau, bạn muốn làm điều gì đó với tài khoản của người dùng, chỉ cần sử dụng như sau:

$session = json_decode($db->query("SELECT ..."));//get session from db $this->facebook->setSession($session);

Sau này bất kỳ yêu cầu rằng các api làm sẽ được thông qua truy cập của người dùng này.

Điều tồi tệ nhất về api biểu đồ facebook hiện tại là (sửa tôi nếu tôi sai) rằng api hiện tại bỏ qua phiên (có vẻ như vẫn còn từ api cũ) trong tất cả tài liệu của nó và chỉ nói về access_token. Nhưng api hiện tại (php5-sdk) đã không có tính năng để gửi một yêu cầu thực tế chỉ sử dụng access_token. Nếu có một chức năng để bắt đầu một phiên một phiên chỉ sử dụng access_token, tôi không nhận thức được nó.

11

Nếu bạn muốn cuối cùng muốn sử dụng PHP, với Facebook PHP SDK v3 (see on github), nó là khá đơn giản. Để đăng nhập người nào đó có sự cho phép của offline_access, bạn hỏi khi tạo URL đăng nhập. Đây là cách bạn làm điều đó.

Get access token

Đầu tiên ẩn bạn kiểm tra nếu người dùng đang đăng nhập hay không:

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; 
    } 
} 

Nếu ông không phải là, bạn tạo ra các "Login with Facebook" URL yêu cầu các offline_access phép:

if (!$user) { 
    $args['scope'] = 'offline_access'; 
    $loginUrl = $facebook->getLoginUrl($args); 
} 

Và sau đó hiển thị các liên kết trong mẫu của bạn:

<?php if (!$user): ?> 
    <a href="<?php echo $loginUrl ?>">Login with Facebook</a> 
<?php endif ?> 

Sau đó, bạn có thể truy xuất mã thông báo truy cập ngoại tuyến và lưu trữ.Để có được nó, hãy gọi:

if ($user) { 
    $token = $facebook->getAccessToken(); 
    // store token 
} 

Sử dụng truy cập ẩn thẻ

Để sử dụng access token ẩn khi người dùng không đăng nhập:

require "facebook.php"; 
$facebook = new Facebook(array(
    'appId' => YOUR_APP_ID, 
    'secret' => YOUR_APP_SECRET, 
)); 

$facebook->setAccessToken("..."); 

Và bây giờ bạn có thể thực hiện cuộc gọi API cho người dùng này:

$user_profile = $facebook->api('/me'); 

Hy vọng điều đó sẽ hữu ích!

+0

Cảm ơn bạn đã cập nhật thông tin. – aiham

5

Bạn muốn bắt đầu bằng cách đọc phần Server Side Flow trong hướng dẫn xác thực. Về cơ bản, bắt đầu với URL này:

https://www.facebook.com/dialog/oauth 

Thêm ứng dụng id của bạn (available here) vào URL, mà trong OAuth cách nói là client_id:

https://www.facebook.com/dialog/oauth?client_id=184484190795 

Thêm offline_accesspermission hoặc scope trong OAuth cách nói :

https://www.facebook.com/dialog/oauth?client_id=184484190795&scope=offline_access 

Thêm redirect_uri đó là nơi Facebook sẽ chuyển hướng đến sau khi người dùng hoàn thành bước ủy quyền ("Allow" hoặc "Dont Allow", nhìn vào tài liệu cho định dạng phản ứng hoặc chỉ thử nó ra):

https://www.facebook.com/dialog/oauth?client_id=184484190795&scope=offline_access&redirect_uri=https%3A%2F%2Ffbrell.com%2Fecho 

Nếu bạn làm theo the link above, nó sẽ đưa bạn đến một dấu nhắc, và sau đó khi nhấp vào Cho phép/Không cho phép nó sẽ đưa bạn đến một trang "echos" trở lại yêu cầu. Nếu bạn bấm Allow, bạn sẽ nhận được một thông số code trở lại, mà bạn có thể đổi lấy một access_token bằng cách làm cho một yêu cầu HTTP lên Facebook từ máy chủ của bạn, mà làm điều gì đó dọc theo dòng này:

https://graph.facebook.com/oauth/access_token?client_id=184484190795&client_secret=XXX&code=YYY&redirect_uri=ZZZ 

Bạn cần để chuyển vào số client_id, bí mật ứng dụng của bạn phải được chuyển vào làm client_secret, cùng một số redirect_uri như bạn đã sử dụng trước đó và số code mà bạn đã nhận được làm phản hồi. Điều này sẽ trả lại offline_access được bật access_token cho người dùng đó.

Một điều cần nhớ là ngay cả khi bạn yêu cầu offline_access ứng dụng của bạn phải xử lý một cách duyên dáng access_tokens không hợp lệ hoặc đã hết hạn vì điều đó có thể xảy ra vì nhiều lý do khác nhau.

Các vấn đề liên quan