Спасибо за ответ, который помогает прояснить ситуацию.
Так что для простого RESTful API нет никакого реального преимущества в использовании RSA над HSA.
Некоторые Точки, которые могут помочь другим в отношении аутентификации на основе токенов:
Преамбула: все это в контексте использования SSL.
Во-первых, токен заменяет учетные данные имени пользователя / пароля: если У клиента есть токен, это эквивалентно имени пользователя / паролю. Мне понадобилось время, чтобы понять это. Это похоже на использование значка на корпоративном принтере: вместо ввода имени пользователя и пароля вы просто помещаете свой значок (токен) на принтер, и он знает, кто вы, и печатает ваш документ.
Однако токены делают использовать API гораздо проще, потому что
- клиент просто добавляет свой токен в заголовок http,
- сервер только проверяет токен,
- также не приходится иметь дело с потоки аутентификации, включающие имя пользователя / pw и управляющие сеансовые куки.
Но недостатком является то, что
- потеря токена подобна потере имени пользователя / пароля и
- в сложной системе, включающей много компонентов, токенов должно быть общим для всех задействованных внутренних серверов.
Во-вторых, клиенту не нужно строго проверять токен - ему нужен только токен - если кто-то дает вам ключ от своего дома или машина, вы обычно не проверяете ключ, вы доверяете человеку (может быть, иногда глупо) и используете его. Таким образом, простая случайная строка может служить токеном; сервер поддерживает простую таблицу соотнесения токенов с пользователями без ключей. Если клиент отправляет токен, которого у сервера нет -> доступ запрещен. Если у него есть соответствующий токен -> найдите пользователя, который соответствует токену (обычно с последующей авторизацией).
В-третьих, сервер обычно генерирует токен либо на основе доверия клиента, либо после клиента как-то подтвердил подлинность, например. OAuth. После этого клиент просто отправляет токен с каждым запросом, а сервер ищет его в своей таблице. Однако такие серверные таблицы для токенов с произвольной строкой могут становиться большими и должны быть постоянными, поэтому требуется база данных или файл, и они, как правило, сравнительно медленны, требуют обслуживания и т. Д. c, поэтому вводите с помощью криптографии c подписи и jwt:
В-четвертых, токены с подписью:
- сервер подписывает токен и отправляет его клиенту - но сервер также не должен хранить его без файлов cookie сеанса, как описано выше
- клиент надежно хранит токен и отправляет его с каждым последующим запросом (как со случайным строковым токеном)
- сервер получает запрос, вычисляет подпись JWT, и сравнивает его с подписью токена, отправленного клиентом. Обратите внимание, что нет поиска файлов или БД, только вычисление подписи снова и сравнение ее с подписью, отправленной клиентом. Если подписи совпадают, токен должен совпадать с тем, который выдал сервер, и, следовательно, заголовок и полезная нагрузка jwt также совпадают с выданными сервером
- , теперь сервер интерпретирует полезную нагрузку, esp. пользователь (и обычно выполняет авторизацию)
Итак, использование jwt означает, что серверу НЕ требуется
- база данных или файл с именами пользователей и токенами
- для сохранения токенов
- для поддержки сеансовых куки
Необходимо только создать и сравнить подпись. И для этого нужен ключ шифрования c. Это может быть ключ симметрии c для простого API или ключ асимметрии c для более сложных систем, где должны использоваться общие ключи c.
Надеюсь, что это поможет некоторым другим измученным душам, которые столкнулись с это топи c.