目录

 

 

Key Authentication

基于 Key 字符串的认证。

工作原理

  1. 服务端生成 Key 字符串发送给客户端;
  2. 客户端访问时携带 Key 字符串,如果 Key 存在,则认证通过。

关键参数

  • config.key_names:HTTP Header key 的名称,默认为 apikey,使用逗号隔开。
  • config.key_in_body:key 是否存在 Request Body,默认为 false,如果为 true 则插件从 Request Body 读取 key。
  • config.hide_credentials:如果身份认证失败,该值(指定一个 Consumer ID)则用做匿名使用者。如果为空,则认证失败闭关返回 4xx。
  • config.ren_on_preflight:如果设置为 true 则插件将运行在请求之前,如果为 false 则请求将总是被允许,然后再进行认证。

使用

# Create a Consumer
curl -d "username=user123&custom_id=SOME_CUSTOM_ID" http://kong:8001/consumers/

# Create a Key
$ curl -X POST http://kong:8001/consumers/{consumer}/key-auth-enc -d '{some_key}'

# Using the Key
curl http://kong:8000/{proxy path} \
    -H 'apikey: <some_key>'
JWT Authentication

JWT(JSON Web Token)本质是一个 Token 字符串,该 Token 被设计成紧凑且安全。JWT 特别适用于分布式站点的单点登录(SSO)场景中,用于分布式组件之间的认证方式。

JWT Token 由三部分组成:

  1. Header(红色):指定 Token 类型、签名算法类型(e.g. HMAC、SHA256、RSA 等),使用 Base64 进行编码。

    1. alg:指定签名算法。
    2. typ:指定 Token 类型。
  2. Playload(紫色):指定用户 ID 等关键信息,使用 Base64 进行编码。Playload 部分有 5 个参数:

    1. iss(issuer):指定该 JWT 的签发者。
    2. sub(subject):指定该 JWT 所面向的用户。
    3. aud(audience):指定该 JWT 的接收方。
    4. exp(expires):过期时间,这里是一个 Unix 时间戳。
    5. iat(issued at):签发时间。
  3. Signature(蓝色):指定数字签名(一个 Secret),用于验证消息在传递过程中有没有被更改过。

    1. 为了得到 Signature 部分,首先必须有已编码的 Header 和 Payload,签名算法在 Header 中指定。e.g. HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
    2. secret:并且对于使用私钥进行签名的 JWT Token,还可以验证 JWT 的发送方是否为对称的发送方,以此来保证了整个信息的完整性、可靠性。

Kong APIGW — Plugins — Authentication_Kong APIGW

工作原理
Kong APIGW — Plugins — Authentication_Kong APIGW_02

Kong JWT Authentication 插件可以为指定的 Service、Route 或 Globally 添加 JWT 认证。

关键参数

使用

# Enabling the plugin globally
$ curl -X POST http://kong:8001/plugins/ \
    --data "name=jwt"

# Create a Consumer
$ curl -X POST http://kong:8001/consumers --data "username=kirito"

# Create a JWT credential
curl -X POST http://kong:8001/consumers/{consumer}/jwt -H "Content-Type: application/x-www-form-urlencoded"
HTTP/1.1 201 Created

{
    "consumer_id": "7bce93e1-0a90-489c-c887-d385545f8f4b",
    "created_at": 1442426001000,
    "id": "bcbfb45d-e391-42bf-c2ed-94e32946753a",
    "key": "a36c3049b36249a3c9f8891cb127243c",
    "secret": "e71829c351aa4242c2719cbfbe671c09"
}


# List JWT credentials
$ curl http://kong:8001/consumers/kirito/jwt
{
    "total": 1,
    "data": [
        {
            "created_at": 1523432449000,
            "id": "cb01a6cf-7371-4f23-8193-fa69a0bb070c",
            "algorithm": "HS256",                             # 签名算法,对应 Header 的 alg。
            "key": "vcnvYSFzTIGyMxzKSgnNU0uvxixdYWB9",        # 用户 key,对应 Playload 的 iss。
            "secret": "qQ9tSqIYjilnJmKuZXvJpgNo4ZqJDrim",     # 密钥,对应 Signature 的 secret。
            "consumer_id": "7d34e6bc-89ea-4f33-9346-9c10600e4afd"
        }
    ]
}

Craft a JWT with a secret:根据 Consumer Info 中关键的 algorithm、key、secret 参数信息,然后使用 jwt 官网(jwt.io)提供的 Debugger 功能可以很简易的生成 JWT Token 字符串:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ2Y252WVNGelRJR3lNeHpLU2duTlUwdXZ4aXhkWVdCOSJ9.3iL4sXgZyvRx2XtIe2X73yplfmSSu1WPGcvyhwq7TVE

Kong APIGW — Plugins — Authentication_Kong APIGW_03

测试

$ curl http://kong:8000/{route path} \
-H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ2Y252WVNGelRJR3lNeHpLU2duTlUwdXZ4aXhkWVdCOSJ9.3iL4sXgZyvRx2XtIe2X73yplfmSSu1WPGcvyhwq7TVE'

可以指定 Consumer infos 中的 key(Playload.iss)和 secret(Signature.secret)

curl -X POST http://kong:8001/consumers/kirito/jwt --data "secret=YmxvYiBkYXRh" --data "key=kirito"