Envoy 验证失败
Jwt verification fails by Envoy
我有一个 Laravel(Lumen) 登录 API,它使用 HS256 生成 JWT。然后我将我的不记名令牌发送到 Envoy 网关并从 Envoy
JWT verification fails
在官方 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;
}
这是我的特使配置:
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
使用对称算法 (HS256) 对令牌进行签名和验证。
对称密钥的密钥参数在 Envoy 配置中以 local_jwks
参数中的 JSON Web Key 形式提供。参数“k”中的键值本身应该以 Base64Url 格式存储:
The "k" (key value) parameter contains the value of the symmetric (or other single-valued) key. It is represented as the base64url encoding of the octet sequence containing the key value.
此处使用 Base64Url 编码,以便能够使用二进制密钥(即每个字节都可以具有从 0 到 255 的整个范围内的任何值的密钥)进行签名。
当密钥用于签名和验证时,必须将其解码为(可能)二进制形式。
为了坚持简单的示例密钥“helloworld”(当然,只是为了说明,而不是真正的密钥),这个密钥必须存储为 "k":"aGVsbG93b3JsZA"
(“helloworld”的 base64url 形式") 在配置中的内联 jwk 和
以未编码形式“helloworld”用于对令牌进行签名。接收方也使用k的base64url解码值来验证签名。
总结:
- 创建二进制密钥并对其进行 base64url 编码
- 将编码后的密钥存储在 Envoy 配置中
local_jwks
参数的“k”参数中
- 解码“k”的值以将其用作验证或签署令牌的密钥
您可以使用以下网站https://base64.guru/standards/base64url/encode对base64url进行编码。
在“k”中:tempo-secret base64URL 编码
我的工作配置:
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: 'jwt-issuer'
forward: true
local_jwks:
inline_string: '{"keys":[{"kty":"oct","alg":"HS256","k":"dGVtcG8tc2VjcmV0"}]}'
# from_headers:
# - name: authorization
rules:
- match:
prefix: "/"
requires:
我有一个 Laravel(Lumen) 登录 API,它使用 HS256 生成 JWT。然后我将我的不记名令牌发送到 Envoy 网关并从 Envoy
JWT verification fails
在官方 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;
}
这是我的特使配置:
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
使用对称算法 (HS256) 对令牌进行签名和验证。
对称密钥的密钥参数在 Envoy 配置中以 local_jwks
参数中的 JSON Web Key 形式提供。参数“k”中的键值本身应该以 Base64Url 格式存储:
The "k" (key value) parameter contains the value of the symmetric (or other single-valued) key. It is represented as the base64url encoding of the octet sequence containing the key value.
此处使用 Base64Url 编码,以便能够使用二进制密钥(即每个字节都可以具有从 0 到 255 的整个范围内的任何值的密钥)进行签名。
当密钥用于签名和验证时,必须将其解码为(可能)二进制形式。
为了坚持简单的示例密钥“helloworld”(当然,只是为了说明,而不是真正的密钥),这个密钥必须存储为 "k":"aGVsbG93b3JsZA"
(“helloworld”的 base64url 形式") 在配置中的内联 jwk 和
以未编码形式“helloworld”用于对令牌进行签名。接收方也使用k的base64url解码值来验证签名。
总结:
- 创建二进制密钥并对其进行 base64url 编码
- 将编码后的密钥存储在 Envoy 配置中
local_jwks
参数的“k”参数中 - 解码“k”的值以将其用作验证或签署令牌的密钥
您可以使用以下网站https://base64.guru/standards/base64url/encode对base64url进行编码。
在“k”中:tempo-secret base64URL 编码
我的工作配置:
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: 'jwt-issuer'
forward: true
local_jwks:
inline_string: '{"keys":[{"kty":"oct","alg":"HS256","k":"dGVtcG8tc2VjcmV0"}]}'
# from_headers:
# - name: authorization
rules:
- match:
prefix: "/"
requires: