softasap.sa-kong
sa-kong
Kong是一个可扩展的开源API层(也称为API网关或API中间件)。Kong运行在任何RESTful API的前面,可以通过插件扩展,提供超出核心平台的额外功能和服务。
Kong最初是在Mashape构建的,用于保护、管理和扩展超过15,000个API和微服务,以支持其API市场,每月为超过200,000名开发者生成数十亿次请求。如今,Kong被小型和大型组织在关键任务部署中使用。
可扩展:Kong可以通过简单增加更多机器来轻松水平扩展,这意味着您的平台可以处理几乎任何负载,同时保持低延迟。
模块化:Kong可以通过添加新插件进行扩展,这些插件可以通过RESTful管理API轻松配置。
在任何基础设施上运行:Kong可以在任何地方运行。您可以在云端或本地环境中部署Kong,包括单个或多个数据中心的设置,以及公共、私有或仅限邀请的API。
您可能听说Kong是基于Nginx构建的,利用了其稳定性和效率。但是这到底是如何实现的呢?
更准确地说,Kong是一个运行在Nginx中的Lua应用程序,这得益于lua-nginx-module。Kong与OpenResty一起分发,后者已包含lua-nginx-module,而不是编译带有该模块的Nginx。OpenResty并不是Nginx的一个分支,而是扩展其功能的一组模块。
这为可插拔架构奠定了基础,在该架构中,Lua脚本(称为“插件”)可以在运行时被启用和执行。因此,我们认为Kong是微服务架构的范例:它的核心实现数据库抽象、路由和插件管理。插件可以在单独的代码库中运行,并可以在请求生命周期的任何地方注入,只需几行代码。
注意:Kong的社区版本不带任何用户界面。您可能想考虑一些开源的WEBUI,比如https://github.com/PGBI/kong-dashboard或https://github.com/pantsel/konga。
根据我们的经验,https://github.com/PGBI/kong-dashboard使用更稳健的开发和发布流程,虽然konga看起来更加富有创意。
# 安装Kong仪表板
npm install -g kong-dashboard
# 启动Kong仪表板
kong-dashboard start --kong-url http://kong:8001
# 在自定义端口上启动Kong仪表板
kong-dashboard start \
--kong-url http://kong:8001 \
--port [端口]
roles:
- {
role: "sa-kong"
}
高级用法:
roles:
- {
role: "sa-kong",
kong_version: 2.0.1,
kong_activated_plugins: "bundled,oidc",
kong_luarocks_plugins:
- kong-oidc
kong_admin_http: "0.0.0.0:8001",
kong_admin_https: "127.0.0.1:8444",
kong_proxy_http: "0.0.0.0:8000",
kong_proxy_https: "0.0.0.0:8443",
kong_pg_host: "127.0.0.1",
kong_pg_port: 5432,
kong_pg_user: kong,
kong_pg_password: kong,
kong_pg_database: kong
}
未分类笔记以供将来使用
您可能感兴趣的第三方插件
kong-oidc
https://github.com/nokia/kong-oidc
kong-oidc是一个Kong插件, 实现了OpenID Connect依赖方(RP)功能。
它通过OpenID Connect发现和基本客户端配置(即授权代码流)对用户进行身份验证。
它通过利用lua-resty-openidc来维持经过身份验证用户的会话,从而提供在客户端浏览器cookie中存储会话状态或使用服务端存储机制(共享内存 | memcache | redis)之间可配置的选择。
它支持解析的发现文档和验证访问令牌的服务器级缓存。
一般来说,您需要一个支持OIDC并注册客户端的授权服务器来开始。您可以使用Keycloak/Gluu等解决方案,或第三方提供的(例如Google的https://developers.google.com/identity/protocols/OpenIDConnect;在这种情况下,您将使用您的Google帐户登录)。
在获取客户端ID/密钥和OIDC发现URL后(请参见https://auth0.com/docs/tutorials/openid-connect-discovery),您可以启用该插件。
示例curl命令可能如下所示:
curl -XPOST -d 'name=oidc' -d 'config.client_id=<client_id>' -d 'config.client_secret=<client_secret>' -d 'config.discovery=<OIDC_Discovery_url>' http://kong:8001/plugins
在此之后,在访问Kong注册的任何API之前,您将被重定向到授权服务器以进行登录。这也为Kong中的所有API提供了SSO解决方案。
这使得Kong成为OIDC依赖方,因此在Kong之后的任何API都可以受益于OIDC身份验证保护,而无需实现OIDC流程。
在实践中,它使用授权码授权(https://auth0.com/docs/api-auth/grant/authorization-code)。如果未经身份验证的用户尝试访问启用了此插件的Kong API,系统将重定向用户代理(浏览器)到AS上的登录页面(AS位置通过配置中的发现字段设置)。成功登录后,AS会给您一个访问代码,并重定向回Kong。Kong使用这个访问代码来获取访问、ID和刷新令牌。
令牌存储在一个加密的会话cookie中。加密密钥是几个变量(用户代理、远程IP地址等)和在启用插件时可以定义的session_secret的组合(请参见https://github.com/nokia/kong-oidc/blob/master/kong/plugins/oidc/schema.lua)。这个字段是可选的,但强烈建议并且必须是随机的!
如果Kong插件看到已经设置了cookie,它将解密并验证令牌。使用刷新令牌刷新访问令牌也由该插件处理。
它还会向上游服务器的请求添加一些信息。它用来自用户信息端点(https://connect2id.com/products/server/docs/api/userinfo)的输出设置X-Userinfo头。
一般来说,OIDC的流和逻辑是由lua-resty-openidc包实现的。
它是无状态的,Kong的数据存储未被使用。所以如果使用该cookie在另一个浏览器或另一台机器上将无法工作。要使令牌失效,您可以调用根URL /logout(http://
原始令牌不会发送到上游服务器,但X-Userinfo头包含来自ID令牌的声明(但没有AS签名)。
侧注 - 如果您打算在容器化的Kong中使用插件,您需要:
FROM kong:1.4.0-alpine
LABEL description="Alpine + Kong 1.4.0 + kong-oidc 插件"
RUN apk update && apk add git unzip luarocks
RUN luarocks install kong-oidc
在映像中,可以使用环境变量KONG_PLUGINS
激活插件。
KONG_PLUGINS=oidc
来自Kubernetes部署的示例:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-kong
annotations:
plugins.konghq.com: oidc
spec:
rules:
- http:
paths:
- path: /graphql
backend:
serviceName: corphub-graphql-service
servicePort: 8082
---
apiVersion: configuration.konghq.com/v1
kind: KongPlugin
metadata:
name: kong-oidc
labels:
global: "true"
config:
client_id: kong
client_secret: XXX
discovery: http://keycloak:8180/auth/realms/master/.well-known/openid-configuration
plugin: oidc
Kong Middleman
https://github.com/pantsel/kong-middleman-plugin
这是一个Kong插件,在代理原始请求之前启用一个额外的HTTP POST请求。
kong-external-oauth
https://github.com/mogui/kong-external-oauth
这是一个Kong插件,可以让您使用外部OAuth 2.0提供商来保护您的API。
$ luarocks install external-oauth
要使Kong知道它需要查找新插件,您需要在配置文件中将其添加到custom_plugins属性中。
custom_plugins:
- external-oauth
您可以通过以下请求添加该插件:
$ curl -X POST http://kong:8001/apis/{api}/plugins \
--data "name=external-oauth" \
--data "config.authorize_url=https://oauth.something.net/openid-connect/authorize" \
--data "config.scope=openid+profile+email" \
--data "config.token_url=https://oauth.something.net/openid-connect/token" \
--data "config.client_id=SOME_CLEINT_ID" \
--data "config.client_secret=SOME_SECRET_KEY" \
--data "config.user_url=https://oauth.something.net/openid-connect/userinfo" \
--data "config.user_keys=email,name,sub" \
--data "config.hosted_domain=mycompany.com" \
--data "config.email_key=email"
表单参数 | 默认值 | 描述 |
---|---|---|
name |
插件名称 external-oauth |
|
config.authorize_url |
OAUTH提供商的授权URL(未认证时将被重定向的URL) | |
config.scope |
授权请求的OAUTH范围 | |
config.token_url |
请求访问令牌的Oauth提供商的URL | |
config.client_id |
OAUTH客户端ID | |
config.client_secret |
OAUTH客户端密钥 | |
config.user_url |
用于检索用户信息的Oauth提供商的URL,还用于检查访问令牌的有效性 | |
config.user_keys 可选 |
username,email |
从user_url 端点返回的JSON中提取的键,它们也将作为X-OAUTH-XXX 添加到上游服务器的头中 |
config.hosted_domain |
必须属于该域的用户才可登录。如果为空则忽略 | |
config.email_key |
检查托管域的键,来自userinfo端点 | |
config.user_info_periodic_check |
60 | 令牌检查之间的时间(秒) |
除了user_keys
外,还将添加一个X-OAUTH-TOKEN
头,其中包含提供商的访问令牌。
Postgres后端
修改后的pg_hba.conf将类似于:
local all postgres peer
# 类型 数据库 用户 地址 方法
# "local" 仅用于Unix域套接字连接
local all all md5
# local all all peer
# IPv4本地连接:
host all all 127.0.0.1/32 password
host all all 127.0.0.1/32 md5
# IPv6本地连接:
host all all ::1/128 md5
# 允许来自localhost的复制连接,由具有复制权限的用户执行。
#local replication postgres peer
#host replication postgres 127.0.0.1/32 md5
#host replication postgres ::1/128 md5
第三方参考
仪表盘
Konga https://github.com/pantsel/konga (Kong > 1)
Kong-Dashboard https://github.com/PGBI/kong-dashboard (Kong > 0.9)
声明式配置工具
kongfig https://github.com/mybuilder/kongfig (Kong < 1)
Deck https://github.com/hbagdi/deck (Kong >= 1)
使用ansible galaxy工作流
如果您使用命令安装了sa-kong角色:
ansible-galaxy install softasap.sa-kong
该角色将在文件夹library/sa-kong中可用。
请根据需要调整路径。
- {
role: "softasap.sa-kong"
}
版权及许可证
代码的双重许可证遵循BSD 3条款和MIT许可证。选择符合您需求的许可证。
联系我们:
在FB上订阅角色更新!
加入Gitter讨论频道,网址为Gitter
在http://www.softasap.com/roles/registry_generated.html发现其他角色