我们正在利用 Kubernetes 入口和外部服务 JWT 身份验证,使用auth-url
作为入口的一部分。
现在我们想使用auth-cache-key
注释来控制 JWT 令牌的缓存。 目前,我们的外部身份验证服务只是通过查看令牌来响应200
/401
。我们所有的组件都是带有 rest API 的后端微服务。传入请求可能不是 UI 请求。我们如何为传入的 JWT 令牌填写"身份验证缓存密钥"。
annotations:
nginx.ingress.kubernetes.io/auth-url: http://auth-service/validate
nginx.ingress.kubernetes.io/auth-response-headers: "authorization"
nginx.ingress.kubernetes.io/auth-cache-key: '$remote_user$http_authorization'
nginx.ingress.kubernetes.io/auth-cache-duration: '1m'
kubernetes.io/ingress.class: "nginx"
查看示例,$remote_user$http_authorization
在 K8s 文档中指定为示例。但是不确定在我们的案例中是否会设置$remote_user
。因为这不是外部基本身份验证。在这种情况下,我们如何决定身份验证缓存键?
没有足够的示例/文档。
发布一般答案,因为没有提供进一步的细节和解释。
确实没有那么多文档,所以我决定深入研究NGINX Ingress源代码。
批注nginx.ingress.kubernetes.io/auth-cache-key
中设置的值是代码中$externalAuth.AuthCacheKey
的变量:
{{ if $externalAuth.AuthCacheKey }}
set $tmp_cache_key '{{ $server.Hostname }}{{ $authPath }}{{ $externalAuth.AuthCacheKey }}';
set $cache_key '';
如您所见,$externalAuth.AuthCacheKey
由变量$tmp_cache_key
使用,它被编码为base64
格式并使用 lua NGINX 模块设置为变量$cache_key
:
rewrite_by_lua_block {
ngx.var.cache_key = ngx.encode_base64(ngx.sha1_bin(ngx.var.tmp_cache_key))
}
然后$cache_key
用于设置变量$proxy_cache_key
,该变量定义了缓存的键:
proxy_cache_key "$cache_key";
基于上面的代码,我们可以假设我们可以使用任何 NGINX 变量来设置nginx.ingress.kubernetes.io/auth-cache-key
注释。请注意,某些变量仅在加载相应模块时才可用。
示例 - 我设置了以下auth-cache-key
注释:
nginx.ingress.kubernetes.io/auth-cache-key: '$proxy_host$request_uri'
然后,在 NGINX 入口控制器 pod 上,在文件/etc/nginx/nginx.conf
中有以下行:
set $tmp_cache_key '{my-host}/_external-auth-Lw-Prefix$proxy_host$request_uri';
如果您将auth-cache-key
注释设置为不存在的 NGINX 变量,NGINX 将抛出以下错误:
nginx: [emerg] unknown "nonexistent_variable" variable
这取决于您需要哪些变量。
另请查看以下文章和主题:
- 使用 NGINX 和 NGINX Plus 进行缓存的指南 外部身份验证
- 提供程序导致大量外部身份验证请求