Tôi đang viết một ứng dụng Facebook liệt kê bạn bè của người dùng và tham chiếu chéo họ với thông tin mà người dùng cung cấp về họ (được lưu trữ trong cơ sở dữ liệu Google App Engine). Đây là cách ứng dụng của tôi chạy:
Sau khi người dùng đăng nhập vào Facebook, họ gọi API đồ thị thông qua SDK Javascript của Facebook để lấy danh sách bạn bè của họ. Đồng thời, yêu cầu AJAX được gửi tới trình xử lý yêu cầu Google App Engine của tôi cùng với ID Facebook của người dùng, nó sẽ gửi lại đối tượng JSON chứa thông tin về bạn bè của người dùng từ cơ sở dữ liệu. Hai danh sách sau đó được tham chiếu chéo trên máy tính của người dùng.
Lỗ hổng bảo mật rõ ràng của phương pháp này là bất kỳ ai cũng có thể gửi yêu cầu đến người xử lý của tôi bằng ID Facebook của bất kỳ người nào mà không cần đăng nhập vào Facebook với tư cách là người đó và nhận được tất cả thông tin mà người đó đã cung cấp về bạn bè của họ. là công khai.
Ngoài việc triển khai hệ thống đăng nhập của riêng mình, cách duy nhất tôi có thể nghĩ ra để đảm bảo phía máy chủ nhận dạng của người dùng là đưa mã thông báo truy cập của người dùng vào yêu cầu AJAX vì mã thông báo truy cập chứng minh rằng người dùng đã đăng nhập vào Facebook. Sau đó, trình xử lý yêu cầu có thể thực hiện một yêu cầu giả tới API đồ thị của Facebook để xác minh rằng yêu cầu đó hợp lệ. Tuy nhiên, điều này có vẻ lỗi thời và tôi không chắc chắn cách xử lý khả năng mã thông báo truy cập hết hạn trong khi được chuyển sang máy chủ App Engine. tôi cũng đã học SDK Python của Facebook , mặc dù tôi không chắc điều này có thể giúp ích như thế nào.
Làm cách nào để máy chủ App Engine xác minh rằng người dùng Facebook đã đăng nhập vào ứng dụng Facebook của tôi?
Hãy thử sử dụng đã ký_request Thay vì gửi facebookID đơn giản - bạn có thể giải mã chúng trên máy chủ bằng cách sử dụng secret_id được cung cấp trên trang ỨNG DỤNG Facebook. Khi đó sẽ không ai có thể gửi cho bạn các truy vấn "giả mạo" vì chúng sẽ không thể giải mã được ở phía máy chủ.
Ví dụ: tôi có một ứng dụng cho phép người dùng bỏ phiếu cho một mục nhất định. Sau khi người dùng chấp nhận quyền, tôi sử dụng JavaScript để gửi phiếu bầu của anh ấy đến máy chủ:
$.ajax({
gõ: "BÀI ĐĂNG",
url: base_url + 'bỏ phiếu/gửi',
dữ liệu: { signature_request: reply.authResponse.signedRequest, vote:vote },
});
Về phía máy chủ, tôi đang giải mã signature_request để lấy FacebookID của người dùng và lưu trữ nó dưới dạng một phiếu bầu hợp pháp... Bằng cách này, không ai có thể gửi cho tôi một phiếu bầu giả vì signature_request được mã hóa theo cách mà chỉ ứng dụng của tôi có thể giải mã nó.
Tất nhiên, phản hồi là một đối tượng được truyền từ SDK sau khi người dùng cho phép sử dụng ứng dụng.
Tôi là một lập trình viên xuất sắc, rất giỏi!