我正在寻找Kong来取代我目前手工推出的NodeJS API网关.目前,我有一个用户服务,通过在登录时提供JWT来处理身份验证(用Django编写),然后客户端通过标头传入.我现在的API网关然后拦截任何电话,也确实验证调用返回给用户的服务,并与替换JWT报头X-User-Id和X-User-Email.
据我所知,孔可以大致做同样的事情.我试图弄清楚这应该如何在一个完美的世界中发挥作用.我仍然有机会更换大部分基础设施,因此重写一些服务并非完全不可能.
所以,在我看来,会发生以下情况:
X-Consumer-*- 这是正确的吗?如果我的想法错了,或者有更好的方法来实现这一点,请纠正我.我对整个微服务的事情都很陌生.
authentication django restful-authentication microservices kong
我想使用Kong作为我的API网关,在Docker容器中运行.每个请求必须首先通过NgInx服务器,如果请求的uri与example.com/api匹配,则必须生成在Kong内注册的api.
为此,我使用以下命令将我的API添加到Kong:
curl -i -X POST --url ipnumber:8001/apis -d 'name=my-api' -d `enter code here`'upstream_url=http://httpbin.org' -d 'hosts=example.com' -d 'uris=/api/my-api'
Run Code Online (Sandbox Code Playgroud)
通过执行以下命令,我得到了正确的答案,所以我认为Kong正常工作.
curl -i -X GET --url ipnumber:8000/api/my-api --header 'Host: example.com'
Run Code Online (Sandbox Code Playgroud)
我的NgInx配置如下所示:
upstream kong {
server 127.0.0.1:8000;
}
location /api {
proxy_pass: http://kong;
}
Run Code Online (Sandbox Code Playgroud)
在我的主机文件中,我使用域example.com配置了NgInx服务器的IP.
问题是:当我浏览example.com/api/my-api甚至是example.com/my-api时,结果是NgInx的404错误页面.
当我浏览到ipnumber:8000/api/my-api时,它会显示一条消息,表示没有与给定值匹配的api,这是正确的,因为主机名不是example.com
我已经很久没看到这个问题,但是我还没能解决它.我也期待https://getkong.org/docs/0.10.x/configuration/#custom-nginx-configuration-embedding-kong但我不确定我是否必须这样做,因为我已经我自己的nginx配置.
提前感谢您的反馈.
我正在开发 kong 0.13.1。按照文档,我添加了证书,如下所示:
{
"data": [
{
"cert": "certificate is really here",
"created_at": 1529667116000,
"id": "6ae77f49-a13f-45b1-a370-8d53b35d7bfd",
"key": "The key is really here",
"snis": [
"myapp.local",
"mockbin.myapp.local"
]
}
],
"total": 1
}
Run Code Online (Sandbox Code Playgroud)
然后添加了一个与 http 完美配合的 API:
{
"data": [
{
"created_at": 1529590900803,
"hosts": [
"mockbin.myapp.local"
],
"http_if_terminated": false,
"https_only": false,
"id": "216c23c5-a1ae-4bef-870b-9c278113f8f8",
"name": "mockbin",
"preserve_host": false,
"retries": 5,
"strip_uri": true,
"upstream_connect_timeout": 60000,
"upstream_read_timeout": 60000,
"upstream_send_timeout": 60000,
"upstream_url": "http://localhost:3000"
}
],
"total": 1
}
Run Code Online (Sandbox Code Playgroud)
但不幸的是,Kong 不断向我发送位于 /usr/local/kong/ssl/kong-default.crt
我正在测试它:
openssl s_client -connect …Run Code Online (Sandbox Code Playgroud) 我正在使用cert-manager-v0.10.0从其掌舵图安装
我正在使用像入口控制器一样的kong来管理入口操作。
所以我创建了一个ClusterIssuer资源,以便可以通过 kong-ingress 控制器从 Ingress 资源联系它。
这 ClusterIssuer是:
apiVersion: certmanager.k8s.io/v1alpha1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
# The ACME server URL
server: https://acme-v02.api.letsencrypt.org/directory
# Email address used for ACME registration
email: username@mydomain.org
# Name of a secret used to store the ACME account private key
privateKeySecretRef:
name: letsencrypt-prod
# Enable the HTTP-01 challenge provider
solvers:
- http01:
ingress:
class: kong
Run Code Online (Sandbox Code Playgroud)
我正在使用的入口资源是这个。
你可以在这里看到,根据kubernetes.io/ingress.class: "kong"那里包含的注释,我将它指向之前创建的 ClusterIssuer,并且我将它指向 kong 作为入口控制器:
apiVersion: …Run Code Online (Sandbox Code Playgroud) 我正在构建一个 Lua 库(实际上是一个内部 kong 插件),这是我第一次使用 Lua - 更不用说用它编写生产代码了。
我已经把它变成了luarock。据我所知,它rockspec允许我指定其他库作为依赖项。但似乎不存在开发依赖性的概念。例如,我的测试、模拟等所需的库......我宁愿不让它们成为实际依赖项列表的一部分。
我已经将我的开发依赖项保留在依赖项列表中,但在 git 推送之前将它们注释掉。在生产 Lua 项目中通常如何解决这个问题?管理这些依赖关系的推荐方法是什么?
我有一个用于 Kong 的自定义插件,它在 Kong v0.14.1 上运行良好,但是在我升级到 v.1.0.2 后,它抛出了一个错误。
使用的操作系统:macOS Mojave
在kong.conf文件中,我有以下代码:
log_level = debug
plugins=my-custom-plugin
Run Code Online (Sandbox Code Playgroud)
我尝试使用以下命令启动 Kong:
kong start -c kong.conf
Run Code Online (Sandbox Code Playgroud)
我收到这个错误:
错误:/usr/local/share/lua/5.1/kong/cmd/start.lua:50: nginx: [error] init_by_lua
错误:/usr/local/share/lua/5.1/kong/init.lua: 344 : my-custom-plugin 插件已启用但未安装;
未找到模块“kong.plugins.my-custom-plugin.handler”:未找到 kong.plugins.my-custom-plugin.handler 的 LuaRocks 模块,
没有字段 package.preload['kong.plugins.my-custom-plugin. handler']
没有文件 './kong/plugins/kong-my-custom-plugin/handler.lua'...
我使用以下命令安装了插件:
luarocks make
Run Code Online (Sandbox Code Playgroud)
这给出了以下输出:
my-custom-plugin 1.0-1 is now installed in /usr/local/opt/kong (license: MIT)
Run Code Online (Sandbox Code Playgroud)
不知何故,Kong 似乎无法找到我安装的自定义插件。知道为什么会这样吗?
我有一个服务,它接受正文中带有 base64 编码文件的 POST。Error: 413 Request Entity Too Large当我发布大于 1MB 的任何内容时,我目前正在获取
,否则它工作正常。
我的设置有 kong 代理服务。我通过稳定的 kong helm chart 为代理的入口添加了以下注释:
kubernetes.io/ingress.class: "nginx"
ingress.kubernetes.io/ssl-redirect: “true”
ingress.kubernetes.io/proxy-body-size: 50m
Run Code Online (Sandbox Code Playgroud)
我还将其添加到 kong env 值中:
client_max_body_size: 0
我的理解是这应该更新 nginx.conf
Kong 前面有一个 nginx-ingress,我用稳定的舵图安装了它。对于入口控制器,我设置了:
--set controller.config.proxy-body-size: "50m"
Run Code Online (Sandbox Code Playgroud)
但是,这些设置都不起作用。查看入口控制器的 pod 日志,我看到:
2019/08/02 15:01:34 [warn] 42#42: *810139 a client request body is buffered to a temporary file /tmp/client-body/0000000014, client: 1X.XXX.X0.X, server: example.com, request: "POST /endpoint HTTP/1.1", host: "example.com"
Run Code Online (Sandbox Code Playgroud)
以及kong pod中对应的日志:
2019/08/02 15:01:39 [warn] 33#0: *1147388 a client request …Run Code Online (Sandbox Code Playgroud) 我使用kong作为我的api网关并使用插件kong-oidc使用keycloak进行身份验证。身份验证过程顺利且运行良好。现在我想为不同微服务向 kong 发出的请求添加授权。我打算修改kong-oidc插件。我创建了一个confidential client,role-based policies以及resource based permissions一些在 keycloak 中分配了不同角色的用户。如果用户有权访问特定资源,我想授权他。我可以通过以下请求来做到这一点
http://keycloak-url/auth/realms/$realm/protocol/openid-connect/token \
-H "Authorization: Bearer "$access_token \
--data "grant_type=urn:ietf:params:oauth:grant-type:uma-ticket" \
--data "audience=auth-client" \
--data "permission=af-resource" \
--data "response_mode=decision"
Run Code Online (Sandbox Code Playgroud)
我很关心permission=af-resource. 在请求期间,我不知道资源的名称,但知道请求的 url。我必须请求再次keycloak给我resource-id的requested-url,然后发送上述请求的决定或者有另一种方式?或者我可以以某种方式使用来自token-introspection端点的信息。