【问题标题】:Jwt verification fails by EnvoyEnvoy 验证 Jwt 失败
【发布时间】:2022-01-14 15:31:28
【问题描述】:

我有一个 Laravel(Lumen) 登录 API,它使用 HS256 生成 JWT。然后我将我的不记名令牌发送到 Envoy Gateway 并从 Envoy 获取

JWT 验证失败

在官方 JWT 解码网站上,我可以成功解码并验证我的不记名令牌。在这里我生成我的 JWT:

{
    $payload = [
        'iss' => config('app.name'),                  // Issuer vom Token
        'sub' => strval($user->ID),                       // Subject vom Token
        'username' => $user->username,
        'iat' => time() - 500,                            // Time when JWT was issued.
        'exp' => time() + config('jwt.ttl'),         // Expiration time
        'alg' => 'HS256',
        'kid' => 'ek4Z9ouLmGnCoezntDXMxUwmjzNTBqptKNkfaqc6Ew8'
    ];
    $secretKey = 'helloworld'; //my base64url

    $jwtEnc = JWT::encode($payload, $secretKey, $payload['alg'], $payload['kid']);

    return $jwtEnc;
}

这是我的 Envoy 配置:

static_resources:
  listeners:
    - name: listener_0
      address:
        socket_address:
          address: 0.0.0.0
          port_value: 10000
      filter_chains:
        - filters:
            - name: envoy.filters.network.http_connection_manager
              typed_config:
                '@type': 'type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager'
                stat_prefix: edge
                http_filters:
                  - name: envoy.filters.http.jwt_authn
                    typed_config:
                      "@type": type.googleapis.com/envoy.extensions.filters.http.jwt_authn.v3.JwtAuthentication
                      providers:
                        provider1:
                          issuer: 'Lumen'
                          forward: true
                          local_jwks:
                            inline_string: '{"keys": [{"kty": "oct", "use": "sig", "kid": "ek4Z9ouLmGnCoezntDXMxUwmjzNTBqptKNkfaqc6Ew8", "k": "helloworld", "alg": "HS256"}]}' //'k' is here base64url
                      rules:
                        - match:
                            prefix: "/list"
                          requires:
                            provider_name: "provider1"
                  - name: envoy.filters.http.router
                route_config:
                  virtual_hosts:
                    - name: all_domains
                      domains: [ "*" ]
                      routes:
                        - match:
                            prefix: "/api"
                          route:
                            cluster: loginapi
  clusters:
    - name: loginapi
      connect_timeout: 5s
      load_assignment:
        cluster_name: loginapi
        endpoints:
          - lb_endpoints:
              - endpoint:
                  address:
                    socket_address:
                      address: 0.0.0.0
                      port_value: 8080


【问题讨论】:

    标签: jwt lumen envoyproxy jwk laravel-envoy


    【解决方案1】:

    令牌使用对称算法 (HS256) 进行签名和验证。
    对称密钥的关键参数在 Envoy 配置中的 local_jwks 参数中以 JSON Web Key 的形式提供。参数“k”中的键值本身应该以Base64Url格式存储:

    “k”(键值)参数包含对称(或其他单值)键的值。它表示为包含键值的八位字节序列的base64url编码。

    (见RFC7518 Section 6.4.1

    此处使用 Base64Url 编码以便能够使用二进制密钥(即每个字节可以具有从 0 到 255 的完整范围内的任何值的密钥)进行签名。

    当密钥用于签名和验证时,必须将其解码为(可能)二进制形式。

    为了坚持简单的示例键“helloworld”(当然,只是为了说明,而不是真正的键),这个键必须存储为"k":"aGVsbG93b3JsZA"(“helloworld”的base64url形式)在配置中的内联 jwk 和 以未编码的形式“helloworld”用于对令牌进行签名。接收端也使用k的base64url解码值来验证签名。

    总结:

    • 创建一个二进制密钥并用 base64url 对其进行编码
    • 将编码后的密钥存储在 Envoy 配置中local_jwks 参数的“k”参数中
    • 解码“k”的值,将其用作验证或签署令牌的密钥

    【讨论】:

    • 非常感谢!很有帮助!
    猜你喜欢
    • 2017-09-21
    • 2018-12-03
    • 1970-01-01
    • 2016-06-12
    • 2018-04-30
    • 2018-08-06
    相关资源
    最近更新 更多