Kong을 사용한 사용자 정의 인증

더 콩 게이트웨이



Kong Gateway은 여러 API에 대한 요청을 관리, 구성 및 라우팅하는 API 게이트웨이입니다.

동시에 여러 API에 액세스하기 위해 단일 주소를 해제하는 데 사용됩니다.

목표



이 게시물은 외부 서비스를 사용하여 인증이 포함된 플러그인을 만드는 단계별 방법을 제시합니다. 이 솔루션은 동일한 권한 부여 방법을 확장하는 Kong에서 관리하는 여러 서비스가 존재할 때 사용됩니다.

원래 문제





원래 문제에서 프런트 엔드는 모든 서비스의 주소가 요청을 실행하는 방법을 알아야 하고 두 서비스 모두 인증 토큰의 유효성을 검사하기 위해 외부 인증 서비스를 요청해야 합니다.

콩 추가





이제 프런트 엔드는 kong 주소만 알고 kong은 모든 서비스를 등록하여 요청을 해제합니다. 그러나 모든 서비스에는 여전히 외부 인증 서비스가 필요합니다.

해결책



우리의 솔루션은 Kong Plugin을 구현하여 외부 서비스에서 인증을 검증하고 성공한 경우에만 서비스에 대한 요청을 해제합니다.



플러그인 개발



Kong 요청 수명 주기 동안 실행할 일부 논리를 추가할 수 있습니다. 이를 위해 목적이 다른 플러그인을 추가합니다. 우리의 경우 외부 인증 요청을 요청하고 서비스를 요청하기 전에 인증을 검증하기 위해 cutom-auth라는 플러그인을 만들었습니다.

플러그인 구조에는 lua에서 개발된 두 개의 파일이 포함되어 있습니다.

  • schema.lua: 이 파일은 플러그인 구성을 정의하는 데 사용됩니다. 우리의 경우 외부 인증 요청 URL과 인증을 무시할 경로를 정의했습니다.

  • handler.lua: 플러그인 로직을 실행하기 위한 코어 파일. 다음은 인증의 유효성을 검사하기 위한 외부 인증에 대한 요청입니다.

  • 다음 두 파일의 코드를 볼 수 있습니다.

    스키마.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" },
              }
            },
          },
        }, },
      },
    }
    


    핸들러.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: 인증을 검증하기 위해 외부 인증 URL을 설정하는 데 사용됩니다. 우리의 경우 이 요청은 인증의 유효성을 검사하고 현재 사용자를 반환합니다.

  • public_paths: 서비스 공개 경로를 설정하는 데 사용됩니다. 여기에 매핑된 경로에는 인증 유효성 검사가 필요하지 않습니다.

  • handler.lua에는 몇 가지 단계가 있습니다. 액세스 방법은 Kong이 라이프사이클에서 이 플러그인을 실행하기 위한 진입점입니다.

    첫 번째 작업은 인증의 유효성을 검사하기 위해 정의된 URL에서 GET을 실행하는 것입니다. 요청이 오류 또는 유효하지 않은 상태를 반환하는 경우 Kong은 상태 500 또는 401로 종료됩니다.

    성공할 경우 X-UserInfo 헤더가 base64 문자열에 매핑된 현재 사용자 데이터와 함께 요청에 추가됩니다. 서비스는 이 헤더를 사용하여 인증을 확인하거나 필요한 경우 사용자 데이터를 가져올 수 있습니다.

    결론



    이 플러그인을 통해 Kong은 서비스를 요청하기 전에 인증을 검증할 수 있으며 다이어그램 솔루션의 구조가 완료됩니다.

    I9Partner Company 및 여러 내부 서비스를 사용하여 Kong에서 이 플러그인의 사용을 확인했습니다.

    다음은 Konga에 매핑된 이 플러그인 사용의 예입니다.



    참조


  • Kong Gateway
  • Custom Authentication With Kong

  • 저자



    Jefferson Xavier
    Thyaki Takuno

    AI9Partner 이니셔티브.

    좋은 웹페이지 즐겨찾기