2011-02-14 49 views
11

Do Facebook không dùng FBML mới, tôi đang tìm một cách mới để tạo tab "tiết lộ" (tab trang hiển thị một phiên bản cho người hâm mộ và người khác không phải người hâm mộ) . Facebook đã bổ sung dữ liệu vào signed_request:Giải mã yêu cầu đã ký của Facebook trong Ruby/Sinatra

Khi người dùng chọn ứng dụng của bạn trong menu bên trái, ứng dụng sẽ nhận tham số signed_request với một tham số bổ sung, trang, một mảng JSON chứa 'id' của Trang Facebook của bạn Tab của bạn được lưu trữ bên trong, một boolean ('thích') cho biết người dùng có thích trang hay không, và boolean ('quản trị') cho biết có hay không người dùng là một 'quản trị viên' của Trang cùng với thông tin người dùng mảng.

Tôi có thể đọc tiền phạt đã đăng ký, nhưng sau đó tôi cần xử lý bằng cách giải mã base64url để nhận JSON chính xác. Ngoài ra, tôi đã tìm thấy trong nghiên cứu của tôi rằng JSON được định dạng không chính xác cho Ruby nên cần sửa đổi trước khi giải mã nó. Đây là mã hiện tại (Tôi chỉ đang in yêu cầu đã ký trong index.erb bây giờ):

helpers do 
    def base64_url_decode str 
    encoded_str = str.gsub('-','+').gsub('_','/') 
    encoded_str += '=' while !(encoded_str.size % 4).zero? 
    Base64.decode64(encoded_str) 
    end 

    def decode_data str 
    encoded_sig, payload = str.split('.') 
    data = ActiveSupport::JSON.decode base64_url_decode(payload) 
    end 
end 

get '/' do 
    signed_request = params[:signed_request] 
    @signed_request = decode_data(signed_request) 
    erb :index 
end 

Tôi đang cố gắng giữ ứng dụng càng nhẹ càng tốt và tránh sử dụng thư viện Facebook đầy đủ như thế này không phải là một ứng dụng đầy đủ (chỉ là một tab) và sẽ không yêu cầu bất kỳ quyền bổ sung nào từ người dùng. Bất kỳ khuyến nghị nào về phương pháp phát hiện người hâm mộ cũng được chào đón.

Trả lời

7

Tôi đã thực hiện điều này trước đây. Bạn chỉ cần pad cuối của chuỗi tải trọng với = dấu cho đến khi chiều dài của nó là chia hết cho 4.

này sẽ làm việc:

payload += '=' * (4 - payload.length.modulo(4)) 

(Tôi không chắc chắn nơi/nếu điều này được ghi chép lại bởi Facebook, nhưng một người nào đó trên IRC đã nói với tôi về điều đó vào đầu năm 2011, và chắc chắn đủ, tôi đã tìm thấy phần đệm như vậy trong mã nguồn của nhiều thư viện máy khách Facebook khác nhau)

+0

Điều này có vẻ chặt chẽ, nhưng không chính xác. Bạn chỉ muốn nhấn 1 hoặc 2 ký tự, không bao giờ bằng 3 hoặc 4. ví dụ: nếu payload.module (4) là số không, sau đó không pad. http://en.wikipedia.org/wiki/Base64 –

+0

Lưu ý: Việc đệm với bốn '=' có vẻ bị ngắt nếu bạn sử dụng strict_decode64 hoặc urlsafe_decode64, nhưng được dung thứ bằng decode64. –

6

Tôi sử dụng thư viện fbgraph có phương pháp parse_signed_request.

+0

Đã hoạt động hoàn hảo, tnx –

2

Câu trả lời từ thông báo là chính xác. Tôi chỉ có cùng một vấn đề và đệm nó với một "=" làm việc.

Bạn có thể xác minh điều này bằng cách sử dụng:

Base64.strict_decode64(invalid_payload) 
=> ArgumentError: invalid base64 
Các vấn đề liên quan