Пользовательская аутентификация с помощью Kong


Шлюз Kong

Kong Gateway — это API-шлюз для управления, настройки и маршрутизации запросов к нескольким API.

Он используется для выпуска одного адреса для доступа к нескольким API одновременно.

Задачи

В этом посте представлен шаг за шагом по созданию плагина с аутентификацией с помощью внешнего сервиса. Это решение используется, когда существует несколько сервисов, управляемых Kong, которые расширяют один и тот же метод авторизации.

Исходная проблема

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

Добавление Конга

Теперь front-end знает только адрес kong и регистрацию kong всех сервисов для выполнения запросов. Однако всем службам по-прежнему требуется внешняя служба аутентификации.

Решение

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

Разработка плагина

Можно добавить несколько логик, которые будут выполняться во время жизненного цикла запросов Kong. Для этого мы добавляем плагины с различными целями. В нашем случае мы создали плагин cutom-auth для запроса внешнего auth-запроса и проверки аутентификации перед запросом к сервисам.

Структура плагина содержит два файла, разработанных на языке lua:

  • schema.lua: Этот файл используется для определения конфигураций плагина. В нашем случае мы определили URL-адрес внешнего запроса аутентификации и пути для игнорирования аутентификации.
  • handler.lua: Основной файл для выполнения логики плагина. Здесь представлен запрос к внешнему auth для проверки аутентификации.

Ниже показан код этих двух файлов:

schema.lua

local typedefs = require "kong.db.schema.typedefs"

return {
  name = "custom-auth",
  fields = {
    { protocols = typedefs.protocols_http },
    { consumer = typedefs.no_consumer },
    { config = {
      type = "record",
      fields = {
        { url = typedefs.url({ required = true }) },
        {
          public_paths = {
            type = "array",
            default = {},
            required = false,
            elements = { type = "string" },
          }
        },
      },
    }, },
  },
}
Вход в полноэкранный режим Выйти из полноэкранного режима

handler.lua

local http = require "resty.http"
local ngx = require "ngx"
local cjson = require "cjson"

local ExternalAuthHandler = {
  VERSION = "1.0",
  PRIORITY = 1000,
}

function ExternalAuthHandler:access(conf)
  local path = kong.request.get_path()
  local publicPaths = conf.public_paths;

  for i, pub_path in ipairs(publicPaths) do
    if pub_path == path then
      return
    end
  end

  local client = http.new()

  kong.log("Validating Authentication: ", conf.url)
  local res, err = client:request_uri(conf.url, {
    ssl_verify = false,
    headers = {
      Authorization = kong.request.get_header("Authorization"),
    }
  })

  if not res then
    kong.log.err("Invalid Authentication Response: ", err)
    return kong.response.exit(500)
  end

  if res.status ~= 200 then
    kong.log.err("Invalid Authentication Response Status: ", res.status)
    return kong.response.exit(401)
  end

  local json = cjson.encode(res.body)
  local user_info = cjson.decode(json)
  kong.service.request.set_header("X-UserInfo", ngx.encode_base64(user_info))
end

return ExternalAuthHandler
Вход в полноэкранный режим Выйти из полноэкранного режима

Пояснение

В файле schema.lua мы определили два параметра:

  • url: Используется для установки внешнего auth url для проверки аутентификации. В нашем случае этот запрос проверяет аутентификацию и возвращает текущего пользователя.
  • public_paths: Используется для задания публичных путей сервиса. Пути, указанные здесь, не будут требовать проверки подлинности.

В файле handler.lua есть несколько шагов. Метод доступа является точкой входа для выполнения плагина в жизненном цикле Kong.

Первая операция — это выполнение GET в URL, определенном для проверки аутентификации. Если запрос возвращает ошибку или недействительный статус, Kong будет завершен со статусом 500 или 401.

В случае успеха к запросу будет добавлен заголовок X-UserInfo с текущими данными пользователя, отображенными в строке base64. Сервисы могут использовать этот заголовок для проверки авторизации или получения данных пользователя, если это необходимо.

Заключение

С помощью этого плагина Kong может проверять авторизацию перед запросом сервисов, и структура диаграммного решения завершена.

Мы проверили использование этого плагина в компании I9Partner, используя Kong и несколько внутренних сервисов.

Вот пример использования этого плагина, отображенный в Konga.

Ссылка

  • Шлюз Kong
  • Пользовательская аутентификация с помощью Kong

Авторы

Джефферсон Ксавье
Тиаки Такуно

Инициатива I9Partner.

Оцените статью
devanswers.ru
Добавить комментарий