Как спроектировать и внедрить легкий открытый шлюз API.
Адрес статьи:blog.Park Ruiqing.com/2019/08/05/…
предисловие
С развитием бизнеса подключается все больше третьих лиц, и каждая бизнес-система сталкивается с одной и той же проблемой:如何让第三方安全快速接入
, В настоящее время становится особенно важным иметь службу шлюза API, которая объединяет такие функции, как проверка подписи, аутентификация, ограничение тока и переход на более раннюю версию.
Далее я расскажу, как спроектировать и реализовать легкий открытый шлюз API, включая дизайн интерфейса, дизайн базы данных, схему проверки подписи, аутентификацию и т. д. В этой статье основное внимание уделяется общему дизайну, а конкретные детали реализации будут представлены в последующих статьях. .
Введение в шлюз API
Шлюз API особенно важен в микросервисах, которые абстрагируют функции, общие для различных бизнес-систем, такие как аутентификация, ограничение тока и переход на более раннюю версию, и действуют как барьер за пределами многих внутренних бизнес-систем.
основные потребности
- Подпись и проверка
- Аутентификация
- маршрутизация
- Управление разрешениями и ресурсами
общий дизайн
Такие функции, как проверка подписи и аутентификация, обрабатываются в порядке цепочки ответственности.Шлюз выполняет маршрутизацию в соответствии с конфигурацией и добавляет параметры для взаимодействия с бизнес-системой для обработки (например, фильтрация данных и т. д.).Краткая обработка запросов поток выглядит следующим образом:
дизайн интерфейса
Самая основная функция шлюза — пересылка запросов.Обычным способом является переадресация запросов внутренним службам в соответствии с правилами маршрутизации в конфигурации, такими как:
будет/order/*
Запрос направляется во внутреннюю систему заказов,/user/*
Запрос перенаправляется во внутреннюю пользовательскую систему, которая часто используется в основном шлюзе, отвечающем за всю бизнес-систему.
Дизайн этой бумаги服务于第三方的开放API网关
, не использует описанный выше подход, а помещает запрошенный ресурс в качестве параметра в тело запроса по следующим причинам:
- Открытый API обслуживает третьи стороны, защищает внутренние пути и способствует предоставлению унифицированных и стандартизированных интерфейсов.
- Отображение интерфейса запросов поддерживается таблицей маршрутизации шлюза, а внутренний интерфейс обновляется или даже переключается на новый сервис, а внешний интерфейс остается неизменным.
- Он может выполнять контроль разрешений, текущее ограничение, статистику и т. Д. Для интерфейса более детально.
адрес
Открытый шлюз API обеспечивает единственный внешний вход, а конкретные запрошенные ресурсы передаются в качестве параметров.
общедоступный параметр
Чтобы упростить операции подписи и проверки, а также повысить гибкость, единственная запись имеет фиксированные общедоступные параметры и возвращаемые значения, как показано ниже:
параметры публичного запроса
имя параметра | Это необходимо | тип | Пример | Примечание |
---|---|---|---|---|
app_id | да | string | Идентификатор приложения | |
method | да | string | aaa.bbb.ccc | метод запроса |
charset | да | string | UTF-8 | кодирование |
format | да | string | JSON | формат бизнес-параметров |
sign_type | да | string | RSA2 | Тип подписи |
sign | да | string | подписать | |
timestamp | да | number | 1564929661796 | Отметка времени, единица измерения: миллисекунды |
nonce | да | string | 63DCB93D270E44D49499F9E5D55705FE | Случайная строка (рекомендуется UUID) |
version | да | string | 1.0 | версия интерфейса |
biz_content | да | string | {"start_time":"1564929661796", ...} | Запрос бизнес-параметров |
-
app_id
: идентификатор приложения, идентификатор приложения является предметом авторизации и личность вызывающего абонента -
method
: метод запроса, соответствующий внутреннему URL-адресу, поддерживаемому таблицей маршрутизации шлюза. -
timestamp
иnonce
Используется для предотвращения повторных атак. -
biz_content
: Бизнес-параметр, этот параметр будет передан во внутреннюю бизнес-систему.
общедоступный возвращаемый параметр
имя параметра | Это необходимо | тип | Пример | Примечание |
---|---|---|---|---|
code | да | number | 0 | код ошибки |
message | нет | string | сообщение об ошибке | |
charset | да | string | UTF-8 | кодирование |
format | да | string | JSON | формат возвращаемого параметра |
sign_type | да | string | RSA2 | Тип подписи |
sign | да | string | подписать | |
timestamp | да | number | Отметка времени, единица измерения: миллисекунды | |
biz_content | да | string | {"id":"1564929661796", ...} | Возврат бизнес-параметров |
-
biz_content
: возвращает бизнес-параметры, шлюз пересылает возвращаемое значение бизнес-системы.
Эта статья была опубликована вБлог Пак Жуцин, перепечатка для некоммерческого использования разрешена, но перепечатка должна сохранить оригинального автораПарк Жуйцини ссылка:blog.piaoruiqing.com. Если есть какие-либо переговоры или сотрудничество с точки зрения авторизации, пожалуйста, свяжитесь с адресом электронной почты:piaoruiqing@gmail.com.
схема подписи
И вызывающая сторона, и сервер генерируют2048
немногоRSA
Секретный ключ, открытый ключ обмена, закрытый ключ используется для подписи, открытый ключ используется для проверки подписи, а внешний интерфейс открытого API-шлюза используетсяhttps
, поэтому в настоящее время дополнительное шифрование не требуется.
Алгоритм подписи
Название алгоритма подписи | Имя стандартного алгоритма подписи | Примечание |
---|---|---|
RSA2 | SHA256WithRSA | Обеспечьте длину ключей RSA не менее 2048 |
Правила подписи
Содержимое параметра подписи
выбраковыватьsign
Все параметры после этого.
Порядок параметров подписи
по имени параметраASCII
Сортировка по возрастанию кода (алфавитная сортировка).
Как сгенерировать подпись
Отсортированный список параметров объединяется в参数名a=参数值a&参数名b=参数值b&...&参数名z=参数值z
строку и использовать私钥
генерироватьsign
.
Дизайн базы данных
База данных используется для хранения конфигураций, таких как разрешения ключей, и между программой и базой данных существует несколько уровней кеша для повышения скорости доступа.Краткая диаграмма ER выглядит следующим образом:
-
app
: Принципал вызывающей стороны, используемый для идентификации запрашивающей стороны. -
group
: Группа,app
сгруппировано поgroup
Единая авторизация. -
subject
: основная часть (приложение/группа). -
resource
: ресурсы, поддерживать отношения сопоставления между ресурсами запроса и внутренними интерфейсами,url
+http_method
Соответствует уникальному resource_id.
Технический отбор
В дополнение к удовлетворению функциональных требований к шлюзу необходимо также учитывать требования к производительности, поскольку производительность шлюза как единственного внешнего входа в каждую бизнес-систему может стать узким местом всей бизнес-системы. несложно, требования к производительности высоки, и программирование ответа — хороший выбор.
-
Spring WebFlux
+netty
: адаптивный веб-фреймворк. -
Spring Data Reactive Redis
+Lettuce
: реактивный клиент Redis. -
Guava
: Google Toolkit, используяLoadingCache
как внутрипроцессный кеш.
Эпилог
Шлюз выступает в качестве барьера и входа за пределы внутренней системы.В дополнение к основным функциям и требованиям к производительности необходимо учитывать мониторинг, статистику, журналы и т. д. Существует множество продуктов с открытым исходным кодом для шлюзов, но вы должны учитывать свое собственное дело при выборе, исходя из предпосылки, которая вам подходит, обратитесь к каждой зрелой программе для практики.
Если эта статья была вам полезна, ставьте лайк ( ̄▽ ̄)"
Серия статей:
- Практика открытия шлюза API (1) — проектирование шлюза API
- Практика Open API Gateway (2) — Повтор атаки и защита
- Практика Open API Gateway (3) — Текущее ограничение
Добро пожаловать в публичный аккаунт:
Эта статья была опубликована вБлог Пак Жуцин, перепечатка для некоммерческого использования разрешена, но перепечатка должна сохранить оригинального автораПарк Жуйцини ссылка:blog.piaoruiqing.com. Если есть какие-либо переговоры или сотрудничество с точки зрения авторизации, пожалуйста, свяжитесь с адресом электронной почты:piaoruiqing@gmail.com.