首页 > 解决方案 > 大使的 API 密钥身份验证

问题描述

我试图弄清楚如何在 k8s 上使用 Ambassador 创建一个简单的 API 密钥保护代理,但似乎找不到任何文档。

具体来说,我只想设置它,以便它可以接受带有 API-KEY 标头的请求,对其进行身份验证,如果 API-KEY 对某些客户端有效,则将其传递到我的后端。

标签: authenticationkubernetesapi-gateway

解决方案


我建议您执行以下操作:

  1. 创建一个身份验证应用程序:对于每个受保护的端点,此应用程序将负责验证 Api 密钥。

  2. 配置 Ambassador 将请求重定向到此服务:您只需要注释您的身份验证应用程序服务定义。例子:

    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: auth-app
      annotations:
        getambassador.io/config: |
          ---
          apiVersion: ambassador/v1
          kind:  AuthService
          name:  authentication
          auth_service: "auth-app:8080"
          allowed_request_headers:
          - "API-KEY"
    spec:
      type: ClusterIP
      selector:
        app: auth-app
      ports:
      - port: 8080
        name: auth-app
        targetPort: auth-app
  1. 在auth-app中配置一个与您要认证的应用程序的端点相对应的端点。假设您有一个具有如下映射的应用程序:
    apiVersion: ambassador/v1
    kind:  Mapping
    name:  myapp-mapping
    prefix: /myapp/
    service: myapp:8000

然后你需要在auth-app中有一个端点“ /myapp/ ” 。您将在那里阅读您的API-KEY标头。如果密钥有效,则返回 HTTP 200(OK)。然后,Ambassador 会将原始消息发送到myapp。如果auth-app返回除 HTTP 200 之外的任何其他内容,Ambassador 会将该响应返回给客户端。

  1. 绕过所需应用程序中的身份验证。例如,您可能需要一个登录应用程序,负责向客户端提供 API 密钥。您可以在映射中使用bypass_auth: true绕过这些应用的身份验证:
    apiVersion: ambassador/v1
    kind:  Mapping
    name:  login-mapping
    prefix: /login/
    service: login-app:8080
    bypass_auth: true

如果您想了解有关大使身份验证的更多信息,请选中此项

编辑:根据这个答案,如果您使用 as header ,这是一个好习惯Authorization: Bearer {base64-API-KEY}。在 Ambassador 中,默认情况下允许Authorization标头,因此您无需在allowed_request_headers字段中传递它。


推荐阅读