使用 JWT 保护 API 访问¶
Traefik Hub 功能
此中间件仅在 Traefik Hub 中可用。进一步了解 Traefik Hub 的高级功能。
JSON Web Token(JWT,定义见 RFC 7519)使 Traefik Hub API Gateway 能够通过私有签名密钥或公私钥签名的令牌,保护 API 访问。
Traefik Hub API Gateway 提供多种来源来执行令牌校验:
- 在中间件配置中设置密钥值(
signingSecret选项)。 - 设置公钥:此时,用户应使用私钥对令牌签名,公钥用于验证签名(
publicKey选项)。 - 设置 JSON Web Key(JWK) 文件,定义用于验证传入 JWT 签名的一组 JWK(
jwksFile选项)。 - 设置 JSON Web Key(JWK) URL,定义提供 JWK 集合的主机 URL(
jwksUrl选项)。
仅使用一个来源
JWT 中间件不允许同时设置多种传入令牌校验方式。 当 Hub API Gateway 收到必须通过 JWT 中间件校验的请求时,会使用上述配置的来源验证令牌。 如果令牌校验成功,则接受请求。
使用密钥验证 JWT¶
要让 Traefik Hub API Gateway 使用存储在 Kubernetes Secret 中的密钥值校验 JWT,请应用以下配置:
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: test-jwt
namespace: apps
spec:
plugin:
jwt:
signingSecret: "urn:k8s:secret:jwt:signingSecret"apiVersion: v1
kind: Secret
metadata:
name: jwt
namespace: apps
stringData:
signingSecret: mysuperlongsecretapiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: my-app
namespace: apps
spec:
entryPoints:
- websecure
routes:
- match: Path(`/my-app`)
kind: Rule
services:
- name: whoami
port: 80
middlewares:
- name: test-jwtkind: Deployment
apiVersion: apps/v1
metadata:
name: whoami
namespace: apps
spec:
replicas: 3
selector:
matchLabels:
app: whoami
template:
metadata:
labels:
app: whoami
spec:
containers:
- name: whoami
image: traefik/whoami
---
apiVersion: v1
kind: Service
metadata:
name: whoami
namespace: apps
spec:
ports:
- port: 80
name: whoami
selector:
app: whoami使用身份提供商验证 JWT¶
要让 Traefik Hub API Gateway 使用身份提供商校验 JWT(如下例中的 Keycloak 和 Azure AD),请应用以下配置:
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: test-jwt
namespace: apps
spec:
plugin:
jwt:
# Replace KEYCLOAK_URL and REALM_NAME with your values
jwksUrl: https://KEYCLOAK_URL/realms/REALM_NAME/protocol/openid-connect/certs
# Forward the content of the claim grp in the header Group
forwardHeaders:
Group: grp
# Check the value of the claim grp before sending the request to the backend
claims: Equals(`grp`, `admin`)apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: test-jwt
namespace: apps
spec:
plugin:
jwt:
jwksUrl: https://login.microsoftonline.com/common/discovery/v2.0/keysapiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: my-app
namespace: apps
spec:
entryPoints:
- websecure
routes:
- match: Path(`/my-app`)
kind: Rule
services:
- name: whoami
port: 80
middlewares:
- name: test-jwtkind: Deployment
apiVersion: apps/v1
metadata:
name: whoami
namespace: apps
spec:
replicas: 3
selector:
matchLabels:
app: whoami
template:
metadata:
labels:
app: whoami
spec:
containers:
- name: whoami
image: traefik/whoami
---
apiVersion: v1
kind: Service
metadata:
name: whoami
namespace: apps
spec:
ports:
- port: 80
name: whoami
selector:
app: whoami在生产环境使用 Traefik OSS?
如果你在工作中使用 Traefik,可以考虑为 Traefik OSS 增加企业级 API 网关能力或商业支持。
为 Traefik OSS 增加 API 网关能力快捷且平滑,无需推倒重来,现有配置也会完整保留。请通过这个简短视频了解实际效果。