2012-03-30 2 views
2

Если у меня есть сложный объект, который был отправлен как запрос API (например, Заказ ниже), следует ли включать все свойства при создании подписи или использовать только подмножество?Что включать при подписании запроса API

Я спрашиваю, потому что я неясный и смотреть на других API, параметры запросов плоские и простые

public class Order 
    { 
     public string Id { get; set; } 
     public string ClientIdentifier { get; set; } 
     public IEnumerable<OrderItems> OrderItems { get; set; } 
     public long timestamp { get; set; } 
     public string signature { get; set; } 
    } 

public class OrderItems 
{ 
    public string ItemId { get; set; } 
    public string Name { get; set; } 
    public IEnumerable<decimal> PriceBands { get; set; }pes 
      more types 



} 

and so on .... 
+0

Любые предложения? – Noel

+2

Что это должно делать с OAuth? – naveen

ответ

7

Прежде всего, вам нужно понять, что подписание сообщения не позволяет понять, какие данные должны быть включены в запрос. Вот список из 2 основных вещей, которые подписывают запросы, которые блокируют злоумышленники от возможности сделать.

  1. С подписанным запросом пароль хранится в безопасности, и злоумышленник не может использовать информацию в запросе для подписания другого запроса. Это полезно, если злоумышленник может видеть, что запрос отправляется на сервер.
  2. Злоумышленник не может изменять какие-либо данные в запросе, который использовался для генерации подписи без аннулирования подписи, в результате чего сервер отказал в запросе.

Номер 2 имеет уловку. Это помогает защитить данные, являющиеся частью подписи. Если вы оставите какие-либо данные, злоумышленник может изменить эти данные и отправить другое сообщение, кроме сообщения, которое вы отправили. Вот почему при подписании запроса необходимо указать все данные запроса: Полный URI, включая домен, заголовки, параметры запроса и любые опубликованные данные, такие как XML или JSON.

0

Как намекнули Навин в комментариях выше, ваш вопрос, кажется, не быть OAuth вопрос непосредственно:

Глядя на (неплохое) объяснение потока OAuth на http://hueniverse.com/oauth/guide/authentication/ приводит к выводу, что все параметры в запросе OAuth должны использоваться при подписании запроса, поскольку сервер также будет принимать все параметры (по определение) для проверки подписи, поэтому мое предложение - использование всех параметров для подписания тоже;)

Но (как примечание стороны):

Ваш код показывает сложный strutcture данных, которые должны быть представлены, так что это поднимает несколько вопросов: как сделать вы кодируете данные, подлежащие передаче через HTTP? Как выглядит реализация сервера (это ваша собственная реализация или данный сервис)?

Предполагая, что вы будете сериализовать данные в XML или JSON для использования в качестве параметра запроса, вы получите «просто строку» для данных. Эти данные, используемые в качестве параметра запроса, будут полностью использоваться для подписания, как указано выше.

Я также предлагаю использовать реализацию клиента OAuth с открытым исходным кодом. Хорошее место для поиска - это страница клиентской библиотеки Twitter в https://dev.twitter.com/docs/twitter-libraries#dotnet, потому что Twitter использует OAuth для стороннего доступа к своему API, а библиотеки (компоненты OAuth, такие как Hammock) стабильны.

+0

Это не может быть прямой вопрос OAuth, но я ищу руководство относительно того, как я буду подписывать этот тип запроса с помощью OAUth. Включить ли я все параметры запроса, которые означают пересечение всех типов запросов и их добавление? U предлагает сериализовать данные в одну строку (например, JSON) и использовать это. Почему тогда не все API API (например, REST API)? – Noel

+0

В какой-то момент вам нужно преобразовать свой объект запроса в некоторые именованные параметры запроса, которые могут быть переданы через HTTP. И вам нужно включить все параметры, потому что сервер выполнит то же самое при аутентификации запроса. API REST Twitter должен делать то же самое, потому что он также назвал параметры. – jCoder

+0

Также может быть полезно, если вы могли бы предоставить дополнительную информацию о том, как вы действительно выполняете запрос (какая именно библиотека HTTP вы используете), и как вы конвертируете объект запроса в параметры HTTP для фактического HTTP-запроса. – jCoder

0

Как уже указывалось, вам нужно выяснить, какие атаки вы хотите предотвратить.

Обычный подход к случаю, когда данные, которые вы отправляете, чувствительны, - это использовать HTTPS (SSL) для связи с сервером. В этом случае вам не нужно шифровать/подписывать данные, любой простой протокол, включая отправку JSON, в порядке.

Если вы хотите, чтобы неизвестные клиенты могли публиковать данные, используйте mutual SSL, которые позволят вам ограничить доступ клиента к серверу.

Если вы хотите проверить, что данные не подделаны по HTTP-сигналу целого блока данных ... Но гораздо сложнее реализовать правильно, используя существующее SSL-соединение. Выезд http://blogs.msdn.com/b/ericlippert/archive/2011/09/27/keep-it-secret-keep-it-safe.aspx

Смежные вопросы