Я пытаюсь добавить API на верхний конг с помощью oauth2 авторизационного плагина Kong. Шаги
Я следовал согласно их Конг документация :
Я получил client_id, client_secret, provision_key и т. Д. Из вышеперечисленных шагов, но мне интересно, если мне нужно создать сервер oauth2 на моем конце или Конг сам настроил его на их конце, и нам просто нужно вызвать их конечные точки.
Я строю свои API в Laravel.
Я думаю, что мы очень кратко говорили о Gitter, и там я уже сказал, что это зависит от вашего варианта использования. Я сделаю краткое изложение типичных вариантов использования, и где вам нужно, какой вид дополнительной реализации.
Если вам нужны две системы для связи друг с другом из бэкэндов, и эти системы доверяют друг другу, вы можете использовать OAuth2 «Поток учетных данных клиента». В этом случае отсутствует идентификация «конечного пользователя», только две системы, которые явно доверяют друг другу.
Для этого сценария Kong — это все, что вам нужно — просто спросите конечную точку API-токена Kong (<address of kong>:8443/your_api/oauth2/token
для маршрутизации на основе URI, или fqdn.of.kong:8443/oauth2/token
если вы используете маршрутизацию на основе хоста) для токена доступа, используя свой идентификатор клиента и секрет, и вы получите его обратно.
Пример:
curl --insecure -d 'grant_type=client_credentials&client_id=<...>&client_secret=<..>' https://<address of kong>:8443/your_api/oauth2_token
Ваш бэкэнд-сервис получит дополнительные заголовки, такие как X-Consumer-Id
а также X-Custom-ConsumerId
который сопоставляется с потребителем, которого вы создали в Конге.
Если вам нужно использовать свой API из конфиденциального (= классического) веб-приложения, и вам необходимо иметь контекст конечного пользователя для каждого вызова, вы можете использовать OAuth2 «Предоставление кода авторизации». В этом случае вам также понадобится Сервер авторизации, который вам нужно внедрить самостоятельно.
Задача сервера авторизации — установить личность конечного пользователя (учтите: это не в OAuth2 указано, как это делается, и решать вам; вы можете подключиться к другому IdP, вы можете запросить имя пользователя и пароль, …), а затем решить, какие права (= «области действия») пользователь получает при доступе к API. Это полностью зависит от вас, и часть вашей бизнес-логики, как решить это.
Поток идет так:
AS разговаривает с Kong на двух разных уровнях
provision_key
желаемого API[/your_api]/oauth2/authorize
конечная точка, которую он использует для получения URI перенаправления, который включает в себя код авторизации, в контексте аутентифицированного пользователя и его области (scope
а также authenticated_userid
); для вызова этой конечной точки вам понадобится response_type=code
, client_id
, client_secret
, provision_key
, authenticated_userid
(что подходит) и опционально scope
(области действия также должны быть определены в API, если вы хотите использовать это)В случае успеха AS перенаправляет обратно в веб-приложение, используя URI перенаправления, возвращенный Kong
[/your_api]/oauth2/token
конечная точка с его client_id
, client_secret
а также code
, с использованием grant_type=code
Теперь у вас будет токен доступа (и токен обновления), который позволит вашему веб-приложению получить доступ к API от имени аутентифицированного пользователя.
Сервер авторизации должен быть внедрен вами; это не очень сложно, но вам все равно нужно убедиться, что вы знаете, как аутентифицировать пользователя и / или как вы делегируете это какому-то другому IdP.
В случае, если вам нужен доступ к API из одностраничного приложения (например, из приложения Angular или аналогичного), вы должны взглянуть на OAuth2 «неявный поток», который является более простым потоком, чем предоставление кода авторизации, но имеет другие недостатки. Например, нельзя использовать токены обновления.
Этот поток работает следующим образом:
response_type=token
https://your.app.com/#access_token=<...>&token_type=bearer&...
)Ваш SPA теперь сможет использовать токен доступа для доступа к API, как и в случае с кодом авторизации, от имени аутентифицированного пользователя.
Недостаток этого подхода заключается в том, что вы не можете легко обновить токен и что он несколько менее безопасен, чем код авторизации. Но, имея дело с SPA, не так много других безопасных способов делегирования доступа к нему.
Последний сценарий, который я хотел бы затронуть, это мобильные приложения, такие как приложения для Android или iOS. Для них можно использовать последний поток OAuth2, «Предоставление пароля владельца ресурса». Короче говоря, с помощью этого гранта вы обмениваете действительные учетные данные пользователя (имя пользователя и пароль) с токеном доступа и токеном обновления, чтобы вам не приходилось хранить имя пользователя и пароль на мобильном устройстве более, чем временно.
Для этого потока также необходим сервер авторизации, чтобы иметь возможность использовать его с Kong, хотя и на этот раз менее сложным, даже если вы должны внедрить дополнительный token
конечная точка (в дополнение к тому, что имеет Конг), которая не идеально описана в документации Конга.
Было бы так:
client_id
(НЕ секрет, секрет не должен развертываться вместе с приложением), имя пользователя и пароль для вызова конечной точки токена Сервера авторизацииclient_secret
за предоставленный client_id
и provision_key
для желаемого APIAS отправляет вызов конечной точке токена Kong [/your_api]/oauth2/token
, как это:
curl —insecure -d ‘grant_type = пароль&provision_key =<…>&client_id =<…>&client_secret =<…>&authenticated_userid =<…>&scope = ‘https: //: 8443 / your_api / oauth2 / token
Обратите внимание, что этот вызов не содержать имя пользователя и пароль; они не принадлежат здесь, вы должны сверять имя пользователя и пароль с вашим собственным источником личности, Kong не поможет вам в этом.
Этот вызов должен вернуть и токен доступа, и токен обновления, который вы затем сохраните (как можно более безопасно) на своем устройстве. Эти замещать имя пользователя и пароль, которые не должен храниться на устройстве. Маркер доступа может использоваться как и другие потоки контекста конечного пользователя (предоставление кода авторизации, неявное предоставление) для доступа к API. от имени аутентифицированного пользователя.
Я надеюсь, что это поможет пролить некоторый свет на то, как вы можете использовать Kong с OAuth2. Это сложно и сложно, но Конг может действительно помочь понять это правильно и отделить ваши проблемы.
Других решений пока нет …