Key Authentication
基于 Key 字符串的认证。
工作原理:
- 服务端生成 Key 字符串发送给客户端;
- 客户端访问时携带 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 由三部分组成:
-
Header(红色):指定 Token 类型、签名算法类型(e.g. HMAC、SHA256、RSA 等),使用 Base64 进行编码。
- alg:指定签名算法。
- typ:指定 Token 类型。
-
Playload(紫色):指定用户 ID 等关键信息,使用 Base64 进行编码。Playload 部分有 5 个参数:
- iss(issuer):指定该 JWT 的签发者。
- sub(subject):指定该 JWT 所面向的用户。
- aud(audience):指定该 JWT 的接收方。
- exp(expires):过期时间,这里是一个 Unix 时间戳。
- iat(issued at):签发时间。
-
Signature(蓝色):指定数字签名(一个 Secret),用于验证消息在传递过程中有没有被更改过。
- 为了得到 Signature 部分,首先必须有已编码的 Header 和 Payload,签名算法在 Header 中指定。e.g.
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
。 - secret:并且对于使用私钥进行签名的 JWT Token,还可以验证 JWT 的发送方是否为对称的发送方,以此来保证了整个信息的完整性、可靠性。
- 为了得到 Signature 部分,首先必须有已编码的 Header 和 Payload,签名算法在 Header 中指定。e.g.
工作原理:
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
测试:
$ 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"