2010-04-24 33 views
12

Tôi đang cố gắng sử dụng Facebook API đồ thị mới được phát hành gần đây, nhưng dường như tôi không thể làm cho nó hoạt động chính xác.Facebook access_token không hợp lệ?

Tôi đã trải qua các bước, và sau/ủy quyền cho cuộc gọi, tôi nhận được một access_token:

access_token=109002049121898|nhKwSTJVPbUZ5JYyIH3opCBQMf8. 

Khi tôi cố gắng sử dụng thẻ tôi nhận được:

{ 
    "error": { 
     "type": "QueryParseException", 
     "message": "An active access token must be used to query information about the current user." 
    } 
} 

tôi m bối rối như quá tại sao ...

-AC

+1

Điều đó 'access_token' không hoàn chỉnh với tôi. Chúng thường dài hơn nhiều so với những gì bạn đã thể hiện. Có lẽ mã của bạn đang phân tích cú pháp access_token từ URL là lỗi? –

Trả lời

7

điều tương tự ở đây. Tôi đã theo dõi số blog của Ben Biddington để nhận mã thông báo truy cập. Lỗi tương tự khi cố gắng sử dụng nó. Việc triển khai OAuth của Facebook không tuân theo thông số kỹ thuật hoàn toàn, tôi ổn với điều đó miễn là tài liệu rõ ràng, rõ ràng không phải là trường hợp ở đây. Aslo, nó sẽ được tốt đẹp nếu userid và tên người dùng được trả lại với mã thông báo truy cập.

+3

, có vẻ như họ đã khắc phục được sự cố. KHÔNG thêm tham số kiểu. Aslo đảm bảo redirect_uri giống hệt nhau khi thực hiện cuộc gọi authroize và access_token. – JiJ

+0

Ban đầu tôi muốn thực hiện riêng của mình chống lại OAuth của họ (và Twitter quá) để kiểm soát và hiệu suất, nhưng bắt đầu có suy nghĩ thứ hai. Các nhà cung cấp khác nhau (ví dụ: twitter và facebook) cung cấp triển khai hơi khác nhau, trên hết, oauth1/oauth2/ssl và các tính năng xã hội mới sẽ yêu cầu nỗ lực đáng kể để theo kịp các thay đổi và nội dung mới. Đối với Facebook, chỉ cần sử dụng API Javascript Gaph xã hội của họ, cho twitter, chỉ cần sử dụng @Anywhere api. Có lẽ một số chi phí trên tải trang, nhưng phải được chấp nhận trong hầu hết các trường hợp. Tôi có thể ngủ ngon hơn. – JiJ

+1

bỏ phiếu cho "đảm bảo redirect_uri giống hệt nhau khi thực hiện xác thực cuộc gọi authroize và access_token". điều này đã khắc phục được sự cố của tôi. cuối cùng có thể ngừng kéo tóc ra. rằng "type = client_cred" chỉ làm mọi thứ tồi tệ hơn. – nategood

4

Chỉ cần làm rõ - sau khi bạn gọi

https://graph.facebook.com/oauth/authorize? 

bạn sẽ nhận được một mã số đó, kết hợp với CLIENT_ID và CLIENT_SECRET bạn (giả sử bạn đã đăng ký ứng dụng của bạn) có thể được trao đổi cho một access_token tại

https://graph.facebook.com/oauth/access_token? 

Nếu đây thực sự là như thế nào bạn đến bởi ACCESS_TOKEN của bạn, khi đó bạn có thể yêu cầu

https://graph.facebook.com/me/ 
+0

thats những gì ông đang yêu cầu, ông nhận được lỗi QueryParseException từ máy chủ! – Cem

+1

Đúng, đó là cách tôi nhận được access_token - nhưng khi tôi cố gắng truy cập https://graph.facebook.com/me/?access_token=foo tôi nhận QueryParseException ... Ngoài ra, access_token tôi nhận được không có param & exp, có thể có một cái gì đó để làm với nó ... –

+0

im đấu tranh chính xác cùng một điều ở đây, nếu bạn tìm thấy một giải pháp xin vui lòng giữ cho tôi được đăng. – Cem

0

Tôi đã gặp sự cố tương tự. Một vài điều tôi đã thực hiện để giải quyết nó:

  1. Hãy thử nó ra trong tất cả các trình duyệt đầu tiên để đảm bảo các url là chính xác ở từng giai đoạn
  2. Đảm bảo Url chuyển hướng là giống hệt nhau, không chỉ tương đương. Các tham số theo cùng thứ tự, mã hóa giống nhau
  3. Không sử dụng loại = client_cred hoặc bất kỳ điều gì khác cho vấn đề đó
  4. Mã hóa bất kỳ ký hiệu nào trong redirect_url (nhưng không phải phần còn lại của url), ví dụ: http://example.com/fb?foo=234%26bar=567. Điều này gây ra cho tôi nhiều vấn đề nhất. Khi trang gọi lại được chạy, chỉ url trước ký hiệu đầu tiên được bao gồm, vì dấu và được giả định là một phần của url cho graph.facebook.com, không phải là một phần của redirect_url. Sau đó tôi nhận được các giá trị từ chuỗi truy vấn để đặt trong redirect_url cho cuộc gọi thứ hai, nhưng chúng không có ở đó. Khi tôi mã hóa các ký hiệu và chúng xuất hiện chính xác.
  5. Không có bất kỳ giá trị trống trong bạn mã hóa các thông số chuỗi truy vấn (ví dụ? Foo =% 26bar = 123)
0

tôi muốn chỉ ra những gì đã loại được nói trên blog của Ben Biddington, và những gì tôi nhận thấy khi nhìn vào access_token "không đúng định dạng" trong câu hỏi ban đầu. Những người khác đã nói những điều tương tự trong chủ đề này, nhưng tôi muốn được rõ ràng.

Mã thông báo không thực sự không đúng định dạng, mà là mã thông báo cho phép bạn thực hiện hành động thay mặt cho APP chứ không phải người dùng. Đây là mã thông báo bạn sẽ sử dụng nếu bạn muốn nhận tất cả người dùng ứng dụng hoặc xem thông tin chi tiết cho ứng dụng của bạn, v.v. với các yêu cầu thường đến từ máy chủ của bạn chứ không phải máy khách.Loại mã thông báo này có được bằng cách sử dụng tham số type = client_cred. Nếu bạn muốn làm những việc đại diện của người sử dụng, không chỉ định type = client_cred, và chắc chắn rằng bạn chỉ định các thông số sau trong lệnh gọi http://graph.facebook.com/oauth/access_token:

'client_id' => APP_ID 
'redirect_uri' => REDIRECT_URI 
'client_secret' => APP_SECRET 
'code' => $_GET['code'] 

Tôi đã viết điều này như cặp khóa-giá trị của một mảng PHP, nhưng tôi nghĩ bạn có được điểm. Giá trị mã GET đạt được sau khi thực hiện cuộc gọi ban đầu đến http://graph.facebook.com/oauth/authorize với các thông số sau:

'client_id' => APP_ID 
'redirect_uri' => "http://your.connect.url/some/endpoint" 

Tôi hy vọng điều này sẽ hữu ích! Những gì các tài liệu Facebook nói, nhưng đừng nói tốt, là nhận được một access_token là một quá trình hai yêu cầu.

2

Thêm thông số loại trả về auth_token cho cấp ứng dụng, vì vậy tốt hơn nên OMIT nó. Điều gì làm việc cho tôi, sau vô số lần thử và kết hợp, đang sử dụng cùng thông số redirect_url trong cuộc gọi đến /oath/access_token như đã được sử dụng trong cuộc gọi đến /oath/authorize.
Vì vậy, trình tự đầy đủ cho phép ứng dụng của bạn trên danh nghĩa của một ai đó là:

1. cuộc gọi hoặc chuyển hướng đến:

"https://graph.facebook.com/oauth/authorize?client_id=" + my_clientId + "&scope=publish_stream,offline_access,manage_pages" + "&redirect_uri=" + "http://my_redirect_url?blah" 

2. trong trang nằm ở return_url ở trên, vấn đề yêu cầu hay bất cứ những khác url này:

"https://graph.facebook.com/oauth/access_token?client_id=" + client_id + "&client_secret=" + secret + "&code=" + Request.QueryString["code"] + "&redirect_uri=" + "http://my_redirect_url?blah" 
1

Tôi chỉ gặp vấn đề tương tự trong IE8. Giải pháp cho tôi là gửi access_token trong yêu cầu API. Something như thế này:

FB.api('/me/friends?access_token=<YOUR TOKEN> 

tôi đắc thẻ của tôi thông qua PHP như thế này:

// Create our Application instance. 
$facebook = new Facebook(array(
    'appId' => '<API_ID>', 
    'secret' => '<SECRET>', 
    'cookie' => false, 
)); 

$session = $facebook->getSession(); 
$token = $session['access_token']; 
0

tôi thực sự nhận thấy rằng nếu trở lại của bạn uri không có một dấu gạch chéo ở đầu bạn có vấn đề. Tôi hiện đang thử nghiệm trong trình duyệt và return_uri = https: //mydomain.com không hoạt động nhưng return_uri = https: //mydomain.com/ không hoạt động. Nếu tôi sử dụng thông tin đầu tiên tôi nhận được "Lỗi xác thực mã xác minh".

Điều này có vẻ hơi lạ, nhưng tôi hoàn toàn bỏ qua một từ trong thông số/hướng dẫn ở một số nơi. Đã mất hai giờ của cuộc sống của tôi với nó mặc dù.

0

Tôi đã có cùng một vấn đề, nhưng loại bỏ type=client_cred và đảm bảo rằng thông số redirect_uri là giống nhau khi thực hiện ủy quyền và access_token call khắc phục sự cố.

12

Khi sử dụng của bạn ứng dụng Facebook của mã thông báo

Nếu bạn đang sử dụng me bí danh như trong https://graph.facebook.com/me/ nhưng thẻ của bạn được mua lại cho một ứng dụng Facebook, sau đó "tôi" không là nữa - đó là ứng dụng hoặc có thể không có gì. Dù sao, đó không phải là ý định của bạn cho ứng dụng tương tác với chính nó.

Trong trường hợp này, bạn sẽ muốn tương tác với tài khoản người dùng cá nhân của mình từ một ứng dụng. Những gì bạn cần làm (sau khi đưa ra các ứng dụng cho phép nó yêu cầu trong giao diện người dùng khi nó yêu cầu) là tìm userid facebook của bạn # và đặt nó thay cho "tôi" để truy cập thông tin của riêng bạn. ví dụ.Người dùng facebook của Mark Zuckerberg là 4 nên anh ta là https://graph.facebook.com/4/

Bí danh me chỉ hoạt động nếu bạn là bạn! Đôi khi thật khó để nhớ ai là người dùng hiện tại khi lập trình facebook (tức là bạn, Trang, Ứng dụng, v.v.) vì chúng tôi đã quen với việc sử dụng giao diện người dùng facebook như chính chúng ta hầu hết thời gian. Từ quan điểm lập trình, nó phụ thuộc vào mã thông báo có được.

Bài đăng trên blog tuyệt vời luôn giúp tôi sửa là Ben Biddington | Facebook Graph API — getting access tokens.

+2

Đây phải là câu trả lời được chấp nhận – Bostone

+2

Thực ra, không nên. Nhận thông tin theo id là một phương thức công khai, và nó có sẵn ngay cả khi không có người dùng chính xác được kết nối với FB - chỉ cần gọi phương thức này là w/o auth - nó sẽ trả về thông tin người dùng chính xác. Thông qua đi qua "tôi" bạn đang đảm bảo rằng Facebook đã xác định bạn là người dùng FB. – BasTaller

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