Я использую Javascript SDK для создания веб-страницы, которая полностью статична для HTML и Javascript (то есть это не динамически создаваемая веб-разметка через какое-то веб-приложение). Эта веб-страница иногда использует Javascript для отправки POST-данных на сервер - данные, которые должны быть привязаны к конкретному пользователю Facebook. Я использую FB.getLoginStatus
, чтобы определить, кто пользователь. Это дает мне authRepsonse
данные JSON, которые выглядят так:
authResponse:
accessToken:"AAAC91..."
expiresIn: 3786
signedRequest:"Ws93YNGWQeOi..."
userID: "670..."
Я могу отправить signedRequest
на сервер и декодировать его и проверить его там (используя секретный ключ моего приложения), а затем я знаю, что пользователь, в данном случае, «670 ...», поэтому я предположительно может безопасно выполнить любую операцию, которая должна произойти на сервере. Вот данные, которые я извлекаю из подписанного запроса:
{"algorithm"=>"HMAC-SHA256",
"code"=>
"2.AQAKT...|5hVFYWcu5a...",
"issued_at"=>1323403518,
"user_id"=>"670..."}
У меня такой вопрос: что мешает злоумышленнику (который каким-то образом овладел закодированным authResponse выше) просто «воспроизвести» данные подписанного запроса на моем сервере намного позже?
Параметр "нул__ "поначалу выглядел многообещающе, но у меня нет ничего, с чем можно было бы сравнить тот момент времени, когда было выпущено_, чтобы узнать, должен ли я принять этот подписанный запрос или нет. «ExpiresIn» - это другой параметр, связанный со временем, но он не подписан, поэтому я не могу ему доверять Может быть, «код» дает мне дополнительную информацию, но я не вижу, как это расшифровать.
Полагаю, я просто думаю об этом неправильно или использую API не так, как предполагалось. Есть идеи? Спасибо.