2012-05-24 50 views
10

Tôi có một ứng dụng đang chạy mà các bài đăng trên tường đã lên lịch cho một người bạn của họ thay mặt cho người dùng.Nhận xét OAuth trên Facebook: Mã thông báo truy cập không thể được giải mã

Ứng dụng đã chạy tốt trong một thời gian khá lâu nhưng gần đây, một số ít người dùng đã báo cáo các tin nhắn không được đăng.

Các nhật ký cho

OAuthException: The access token could not be decrypted. 

Thậm chí nếu người dùng đã xem lại ứng dụng và reset truy cập của họ mã thông báo ngoại lệ vẫn còn.

Điều gì có thể là gốc của lỗi và cách khắc phục?

+0

Ứng dụng vẫn hoạt động với bất kỳ người dùng nào? Tôi biết rằng thứ Sáu tuần trước (khi Facebook công khai), tất cả các thẻ truy cập cho tất cả các ứng dụng của tôi đã bị thu hồi. Tôi đã phải xóa tất cả các mã thông báo truy cập được lưu trữ của mình và yêu cầu tất cả người dùng của tôi phải "ủy quyền" lại ứng dụng. Nếu tôi cố gắng trao đổi mã thông báo, nó không thành công. Nhưng chỉ cần lặp lại quy trình cấp phép (điều này sẽ không yêu cầu bất kỳ hành động thực sự nào kể từ khi ứng dụng được ủy quyền, chỉ cần nhấp vào liên kết sẽ thực hiện thủ thuật) đã cấp cho tôi một mã thông báo truy cập hợp lệ mới. –

+0

Làm cách nào bạn biết rằng tất cả các mã thông báo truy cập đã bị thu hồi? Bạn có nhận được bất kỳ ngoại lệ nào không? – rahul1810

+0

Tôi đã sử dụng trình gỡ rối mã thông báo truy cập và thấy rằng mọi mã thông báo đơn lẻ mà tôi đã không còn hợp lệ. Tôi chỉ đặt 2 và 2 với nhau từ đó. Vì điều này xảy ra vào ngày họ công khai, và tôi có khoảng 7 ứng dụng. Tất cả mã thông báo truy cập của tôi với tất cả 7 ứng dụng không còn hợp lệ. –

Trả lời

0

Trong trường hợp của tôi, điều này là do accessToken không chứa userID khi tôi thực hiện yêu cầu "me" (trong đó, tôi giả sử, cố gắng xác định userID từ mã thông báo).

Mã phản ứng debugger:

App ID: 
<ID> : <app> 
User ID: Unknown 
Issued: Unknown 
Expires: 1339171200 (in about an hour) 
Valid: True 
Origin: Web 
Scopes: 

Để khắc phục vấn đề này, thay vì yêu cầu 'tôi', tôi yêu cầu hồ sơ cá nhân cho userID, mà tôi có quyền truy cập vào từ authResponse trực tiếp.

8

Nếu bạn nhận được thông báo lỗi sau khi thực hiện các yêu cầu HTTP đến API Facebook:

{ 
    "error": { 
     "message": "The access token could not be decrypted", 
     "type": "OAuthException", 
     "code": 190 
    } 
} 

nó có nghĩa là access token bạn đang gửi lên Facebook khi bạn thực hiện các yêu cầu HTTP là KHÔNG hợp lệ .

Nếu bạn nhìn vào các tiêu đề phản ứng HTTP bạn sẽ thấy một lĩnh vực như thế này:

WWW-Authenticate:OAuth "Facebook Platform" "invalid_token" "The access token could not be decrypted" 

tôi đã nhận được báo lỗi ở trên bởi vì tôi đã gửi một thẻ truy cập đó là 1 nhân vật ngắn hơn so với những gì là cái hợp lệ.
Sau khi so sánh mã thông báo truy cập được duy trì với mã tôi đã gửi, tôi đã phát hiện ra lỗi này.

Bạn có thể kiểm tra tính hợp lệ của mã thông báo truy cập OAuth 2.0 (mã thông báo mang) được sử dụng trên Facebook với Access Token Debugger.

+2

Vâng, cùng ở đây, chỉ là một sai lầm "sao chép/dán" rất ngu ngốc. –

+0

Đã xảy ra sự cố tương tự. Trường biểu mẫu cho mã thông báo trên Facebook có thể lớn hơn. –

2

Điều này có thể do cắt mã thông báo trước khi lưu vào cơ sở dữ liệu. hoặc kích thước của trường nhỏ hơn kích thước đăng ký của token. kiểm tra một lần trong bảng {variable} để có mã thông báo chính xác và đầy đủ.

3

Mã thông báo Facebook đang tăng kích thước và không bị giới hạn tối đa 255 ký tự, do đó cách bạn lưu trữ chúng có thể dẫn đến ngoại lệ nếu bạn sử dụng biến hoặc trường cơ sở dữ liệu có kích thước giới hạn.

này được quy định tại phần cuối của doc Facebook này: https://developers.facebook.com/docs/facebook-login/access-tokens

kích cỡ

Mong đợi rằng kích thước của tất cả các loại thẻ truy cập sẽ thay đổi theo thời gian như Facebook làm thay đổi những gì được lưu trữ trong chúng và cách chúng được mã hóa. Bạn có thể mong đợi rằng chúng sẽ phát triển và co lại theo thời gian.Vui lòng sử dụng loại dữ liệu có độ dài thay đổi mà không có kích thước tối đa cụ thể để lưu trữ mã thông báo truy cập.

Đối dụ để lưu trữ thẻ trong một SQL bạn có thể tránh việc sử dụng VARCHAR và sử dụng TEXT hoặc BLOB thay

+0

Điều này đã giải quyết được vấn đề của tôi. Tôi chỉ lưu trữ 120 ký tự trong cơ sở dữ liệu của mình. +1 –

0

Lỗi này thường xảy ra khi truy cập chiều dài mã thông báo là không đúng. Xác minh định dạng của mã thông báo.

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