kong auth 认证插件使用教程

背景

如何在网关层添加认证功能?本文介绍了在以 db-less 模式运行的 kong 里开启 basic-auth 和 key-auth 这两种认证机制的流程。

Kong 运行环境搭建

使用 docker 快速搭建 db-less 环境:

  1. 创建 docker-compose.yml 内容如下:

    version: "3.8"
    
    services:
      kong:
        image: kong:2.5.1
        volumes:
          - ./kong.yml:/kong.yml
        environment:
          - KONG_DATABASE=off
          - KONG_DECLARATIVE_CONFIG=/kong.yml
        ports:
          - 8000:8000
    
  2. 创建 kong.yml 内容如下:

    这里从 public-apis 里随便找两个免费无须认证的 api 接口做测试

    _format_version: "2.1"
    
    services:
       - name: test-basic-auth
         url: https://dog-api.kinduff.com/api/facts
         routes:
          - name: basic-auth-route
            paths:
             - /dog
               strip_path: true
       
       - name: test-key-auth
         url: https://meowfacts.herokuapp.com
         routes:
          - name: key-auth-route # remind: route name should be unique
            paths:
             - /cat
               strip_path: true
    
  3. docker-compose up 运行服务

  4. 测试:

    • curl http://localhost:8000/dog 正常返回接口信息
    • curl http://localhost:8000/cat 正常返回接口信息

Auth

kong 的插件可以配置在全局(对所有的 route 都会生效),或是配在某个 service(对该 service 下的 route 生效),或是配在某个 route,本文会分别配置在两个 service 下。

kong 的 auth 插件需要先定义 consumer (可理解为 user),然后给 consumer 添加相关认证凭据(credentials)从而实现 auth 功能。

basic-auth

basic-auth 插件官网文档

下面我们给 test-basic-auth 这个 service 添加 basic-auth:

# ↓↓↓↓↓↓↓ new ↓↓↓↓↓↓↓
# 定义一个用户/consumer/user entity
consumers:
  - username: dog-user
# 使用 basic-auth 需要定义 basicauth_credentials entity
basicauth_credentials:
  - consumer: dog-user # 指定该 credential 属于哪个用户
    username: dog # basic auth username
    password: dog-pwd # basic auth password
# ↑↑↑↑↑↑↑ new ↑↑↑↑↑↑↑

services:
  - name: test-basic-auth
    # ↓↓↓↓↓↓↓ new ↓↓↓↓↓↓↓
    plugins:
      # 在该 service 下启用该插件,这里无须指定 consumer,basic-auth 插件会基于请求头的信息找到与之匹配的 credential
      - name: basic-auth
    # ↑↑↑↑↑↑↑ new ↑↑↑↑↑↑↑

因为 basic-auth 插件是 kong 自带并默认启用的,我们无须手动激活它, 重新运行 docker-compose up,然后测试:

key-auth

key-auth 插件官网文档

key-auth 的启用和上述 basic-auth 思路是一样的,只是两者的认证方式不同,故 credential 的配置会不一样:

_format_version: "2.1"

consumers:
   # ↓↓↓↓↓↓↓ new ↓↓↓↓↓↓↓
  - username: cat-user
   # ↑↑↑↑↑↑↑ new ↑↑↑↑↑↑↑

keyauth_credentials:
   # ↓↓↓↓↓↓↓ new ↓↓↓↓↓↓↓
  - consumer: cat-user
    key: random-key
   # ↑↑↑↑↑↑↑ new ↑↑↑↑↑↑↑

services:
  - name: test-key-auth
    # ↓↓↓↓↓↓↓ new ↓↓↓↓↓↓↓
    plugins:
      - name: key-auth
    # ↑↑↑↑↑↑↑ new ↑↑↑↑↑↑↑

key-auth 插件支持设置 key 的读取位置,默认是从请求头里读取 apiKey,大家实际使用时可根据文档自行配置修改,比如需要从请求体里读取,或是名字换成 token 而不是 apiKey,本文将使用默认配置

key-auth 插件也是 kong 自带并默认启用的,我们无须手动激活它, 重新运行 docker-compose up,然后测试:

一些注意事项(采坑)