При работе с большинством API, почему они требуют двух типов аутентификации, а именно, ключ и секрет?

Я собираюсь попытаться суммировать различные ответы сам, так как у каждого было что-то ценное для высказывания, но ни один действительно не добрался до того, что я теперь понимаю, вероятно, лучший ответ:

я задавал неправильный вопрос, потому что я делал его неправильно.

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

module Foo
  def self.method_one
  end

  def Foo.method_two
  end

  class << self
    def method_three
    end
  end

  def method_four
  end

  module_function :method_four
end

я мог также include мой модуль, или в классе, в этом случае методы становятся частью класса или снаружи, в этом случае они определяются на любом классе, который я выполняю внутри (Объект? Ядро? Irb, если я являюсь интерактивным? Вероятно, не прекрасная идея, тогда)

вещь, не было никакого серьезного основания не иметь класс во-первых - я так или иначе добрался до хода мыслей, который взял меня вниз редко используемое и откровенно немного странное ответвление. Вероятно, ретроспективный кадр ко дням перед OO стал господствующей тенденцией (я являюсь достаточно взрослым, что до сегодня я провел намного больше лет, пишущий процессуальный код).

, Таким образом, функции переместились в класс, где они кажутся довольно счастливыми, и методы класса, таким образом представленные, бодро используются везде, где необходимо.

27
задан Bill the Lizard 9 February 2013 в 16:17
поделиться

1 ответ

Когда сервер получает вызов API, ему необходимо знать две вещи: кто делает вызов и является ли вызов законным.

Если у вас был только один элемент («ключ»), и включал его при каждом звонке, он отвечал на оба вопроса. На основе «ключа» сервер знает, кто вы, и поскольку только вы знаете ключ, это доказывает, что вызов действительно исходит от вас. Но включение ключа в каждый звонок - плохая практика безопасности: если кто-то может прочитать хотя бы одно из ваших сообщений в пути, ваш ключ будет скомпрометирован, и кто-то может выдать себя за вас. Так что, если вы не используете HTTPS, этот подход не работает.

Вместо этого вы можете включать цифровую подпись в каждый вызов, подписанный каким-то «секретным» номером. (Сам "секретный" номер не отправляется). Если злоумышленнику удастся прочитать ваше сообщение, он не сможет определить этот «секретный» номер по подписи. (Вот как работают цифровые подписи: они односторонние).

Но это не решает вопрос идентификации: как в последнем случае сервер узнает, кто делает вызов? Он может попытаться сверить подпись с "секретом" каждого пользователя, но, конечно же, это займет очень много времени.

Итак, вот что мы делаем: отправляем как «ключ» (который идентифицирует пользователя), так и подпись, созданную с использованием «секретного» числа (что доказывает, что сообщение законно). Сервер ищет пользователя на основе ключа, а затем проверяет подпись, используя "секретный" номер этого пользователя.

Это немного похоже на то, когда вы выписываете чек: на нем есть номер учетной записи (для вашей идентификации) и ваша подпись (чтобы доказать, что вы являетесь). Наличие только номера счета не доказывает, что вы действительно выписали чек. Наличие только подписи без номера счета вынудило бы банк сравнить ваш чек со всеми своими подписями для всех своих счетов, что, очевидно, было бы неэффективно.

Отправьте как «ключ» (который идентифицирует пользователя), так и подпись, созданную с использованием «секретного» числа (что доказывает, что сообщение является законным). Сервер ищет пользователя на основе ключа, а затем проверяет подпись, используя "секретный" номер этого пользователя.

Это немного похоже на то, когда вы выписываете чек: на нем есть номер учетной записи (для вашей идентификации) и ваша подпись (чтобы доказать, что вы являетесь). Наличие только номера счета не доказывает, что вы действительно выписали чек. Наличие только подписи без номера счета вынудило бы банк сравнить ваш чек со всеми своими подписями для всех своих счетов, что, очевидно, было бы неэффективно.

Отправьте как «ключ» (который идентифицирует пользователя), так и подпись, созданную с использованием «секретного» числа (что доказывает, что сообщение является законным). Сервер ищет пользователя на основе ключа, а затем проверяет подпись, используя "секретный" номер этого пользователя.

Это немного похоже на то, когда вы выписываете чек: на нем есть номер учетной записи (чтобы идентифицировать вас) и ваша подпись (чтобы доказать, что вы являетесь). Наличие только номера счета не доказывает, что вы действительно выписали чек. Наличие только подписи без номера счета вынудило бы банк сравнить ваш чек со всеми своими подписями для всех своих счетов, что, очевидно, было бы неэффективно.

номер (который доказывает, что сообщение является легитимным). Сервер ищет пользователя на основе ключа, а затем проверяет подпись, используя "секретный" номер этого пользователя.

Это немного похоже на то, когда вы выписываете чек: на нем есть номер учетной записи (для вашей идентификации) и ваша подпись (чтобы доказать, что вы являетесь). Наличие только номера счета не доказывает, что вы действительно выписали чек. Наличие только подписи без номера счета вынудило бы банк сравнить ваш чек со всеми своими подписями для всех своих счетов, что, очевидно, было бы неэффективно.

номер (который доказывает, что сообщение является легитимным). Сервер ищет пользователя на основе ключа, а затем проверяет подпись, используя "секретный" номер этого пользователя.

Это немного похоже на то, когда вы выписываете чек: на нем есть номер учетной записи (для вашей идентификации) и ваша подпись (чтобы доказать, что вы являетесь). Наличие только номера счета не доказывает, что вы действительно выписали чек. Наличие только подписи без номера счета вынудило бы банк сравнить ваш чек со всеми своими подписями для всех своих счетов, что, очевидно, было бы неэффективно.

На нем есть номер счета (для идентификации вас) и ваша подпись (чтобы доказать, что вы являетесь). Наличие только номера счета не доказывает, что вы действительно выписали чек. Наличие только подписи без номера счета вынудило бы банк сравнить ваш чек со всеми своими подписями для всех своих счетов, что, очевидно, было бы неэффективно.

На нем есть номер счета (для идентификации вас) и ваша подпись (чтобы доказать, что вы являетесь). Наличие только номера счета не доказывает, что вы действительно выписали чек. Наличие только подписи без номера счета вынудило бы банк сравнить ваш чек со всеми своими подписями для всех своих счетов, что, очевидно, было бы неэффективно.

59
ответ дан 28 November 2019 в 04:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: