如何在 GKE 中使用 Nginx Ingress 将 Auth 服务的 UID 传递给其他服务

问题描述 投票:0回答:1

我正在创建这个架构。 [![单一入口][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

有人可以帮忙找出问题所在吗! [1]:https://i.stack.imgur.com/Eb5ad.png [2]:https://i.stack.imgur.com/M4sJ1.png

node.js kubernetes nginx google-cloud-platform load-balancing
1个回答
0
投票

要使用 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 等占位符替换为您的实际值。

请注意,具体配置可能会有所不同,具体取决于您的身份验证服务、应用程序架构以及您需要解决的任何安全注意事项。始终确保您的身份验证和授权机制安全且经过充分测试。

© www.soinside.com 2019 - 2024. All rights reserved.