我正在创建这个架构。 [![单一入口][1]][1]
因此,我想创建一个身份验证服务,用于验证 Firebase 令牌并返回 uid,然后需要在我的不同微服务 S1、S2 等中传递此 uid。
但问题是当我创建一个入口时,我收到“500内部服务错误”
所以我尝试了这种架构,“500内部服务错误”消失了,但我没有得到我的uid。我正在输入硬编码的 uid 用于测试 [![两个入口][2]][2]
这里是代码:AUTH SERVICE
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
app.use(bodyParser.json());
app.post('/verify-id-token', (req, res) => {
const hardcodedUid = 'my-hardcoded-uid'; // Replace with your desired UID
// Add the UserID to the response header
res.setHeader('UserID', hardcodedUid);
return res.status(200).json({ message: 'Token verified' });
});
const PORT = 8080;
app.listen(PORT, () => {
console.log(`Auth service is running on port ${PORT}`);
});
代码:S1服务
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use((req, res, next) => {
// Extract 'uid' header from the request
const uid = req.header('uid');
console.log('Received request from client with uid:', uid);
// Set 'uid' as a custom header for micro-service1
if (uid) {
req.headers['uid'] = uid;
console.log('Setting uid header for micro-service1:', uid);
}
next();
});
app.get('/', (req, res) => {
// Access the 'uid' header, if present
const uid = req.header('uid');
console.log('Handling request in micro-service1 with uid:', uid);
res.status(200).json({ message: `Hello from micro-service1 ${uid}`, uid });
});
const PORT = 3000;
app.listen(PORT, () => {
console.log(`Micro-service1 is running on port ${PORT}`);
});
代码:ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: service-ingress
annotations:
nginx.ingress.kubernetes.io/auth-method: POST
nginx.ingress.kubernetes.io/auth-url: http://<LB-IP>/verify-id-token
nginx.ingress.kubernetes.io/auth-response-headers: uid
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: test-service1
port:
number: 3000
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: token-ingress
annotations:
nginx.ingress.kubernetes.io/auth-response-headers: uid
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /verify-id-token
pathType: Prefix
backend:
service:
name: auth-service
port:
number: 8080
要使用 Google Kubernetes Engine (GKE) 中的 Nginx Ingress 将用户 ID (UID) 从身份验证服务传递到另一个服务,您可以按照以下步骤操作:
设置身份验证服务: 首先,您需要有适当的身份验证服务。这可能类似于 Keycloak、OAuth2 或任何其他在身份验证时为用户分配 UID 的身份验证机制。
部署您的服务: 在 GKE 集群中部署需要接收 UID 的服务和身份验证服务本身。
配置 Nginx 入口: 如果尚未在 GKE 集群中设置 Nginx Ingress 控制器,请进行设置。您可以使用 Helm 来简化安装过程。
helm 仓库添加 ingress-nginx https://kubernetes.github.io/ingress-nginx 舵回购更新 helm 安装 my-ingress-controller ingress-nginx/ingress-nginx
入口资源配置: 创建 Ingress 资源来定义传入流量应如何路由到您的服务。在注释部分,您可以设置必要的Nginx注释来传递UID。
api版本:networking.k8s.io/v1 种类: 入口 元数据: 名称:我的入口 注释: nginx.ingress.kubernetes.io/auth-signin:https://your-auth-service-url/auth nginx.ingress.kubernetes.io/auth-response-headers:X-用户 ID 规格: 规则: - 主机:your-domain.com http: 路径: - 小路: / 路径类型:前缀 后端: 服务: 名称:您的服务 港口: 数量:80
在此示例中:
auth-signin 指定认证服务所在的URL。 auth-response-headers 告诉 Nginx Ingress 添加名为 X-User-ID 的自定义响应标头。 服务更新: 更新您的服务以从传入请求中读取 X-User-ID 标头并根据需要使用它。
测试: 部署您的 Ingress 资源并测试设置。当用户通过 Ingress 访问您的服务时,Ingress 控制器会将其重定向到身份验证服务。身份验证成功后,UID 将包含在后续请求服务的 X-User-ID 标头中。
请记住将 your-auth-service-url、your-domain.com、your-service 等占位符替换为您的实际值。
请注意,具体配置可能会有所不同,具体取决于您的身份验证服务、应用程序架构以及您需要解决的任何安全注意事项。始终确保您的身份验证和授权机制安全且经过充分测试。