JWT(JSON Web Token)是一种常用的身份认证和鉴权机制。JWT中会携带一些用户信息和一个存储加密后信息的字段。将加密后的信息字段进行解密,与原始用户信息字段进行比较,可以验证该用户的信息是否有效,从而完成身份认证。本文介绍如何在ASM网关中配置JWT认证。
前提条件
操作步骤
- 登录ASM控制台,在左侧导航栏,选择 。
- 在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在入口网关页面,单击目标网关名称。
在网关概览页面左侧导航栏,选择 。
在JWT认证配置配置向导,打开启用网关JWT认证开关,进行相关配置,然后单击下一步。
配置项
说明
Issuer
JWT的颁发者。本示例配置为testing@secure.istio.io。
JWKS来源
选择jwks。
Key
配置示例:
{ "keys":[ {"e":"AQAB","kid":"DHFbpoIUqrY8t2zpA2qXfCmr5VO5ZEr4RzHU_-envvQ","kty":"RSA","n":"xAE7eB6qugXyCAG3yhh7pkDkT65pHymX-P7KfIupjf59vsdo91bSP9C8H07pSAGQO1MV_xFj9VswgsCg4R6otmg5PV2He95lZdHtOcU5DXIg_pbhLdKXbi66GlVeK6ABZOUW3WYtnNHD-91gVuoeJT_DwtGGcp4ignkgXfkiEm4sw-4sfb4qdt5oLbyVpmW6x9cfa7vs2WTfURiCrBoUqgBo_-4WTiULmmHSGZHOjzwa8WtrtOQGsAFjIbno85jp6MnGGGZPYZbDAa_b3y5u-YpW7ypZrvD8BgtKVjgtQgZhLAGezMt0ua3DRrWnKqTZ0BJ_EyxOGuHJrLsn00fnMQ"}]}
高级选项
单击高级选项,在JWT规则高级选项对话框,您可以按需自定义Token的位置、是否透传JWT、是否将JWT中的Payload信息放在请求Header中透传等。配置完成后,单击确定。
在匹配规则配置向导,进行相关配置,然后单击提交。
配置项
说明
匹配模式
本文选择选中请求必须经过认证。取值说明如下:
选中请求必须经过认证:选中的请求必须进行JWT认证。
选中请求可跳过认证:选中的请求可以不进行JWT认证。
添加配置规则
打开HTTP路径(Path)开关,配置为/productpage。该配置表示路径为/productpage的请求只有通过JWT认证,才能进行访问;其他请求(配置规则之外的路径)可以不执行JWT认证。
说明当其他请求进行访问时,不携带JWT的请求可以访问成功,携带错误的JWT的请求会访问失败。
创建成功后,在完成配置向导会显示“网关JWT认证创建成功”和服务网格原生的安全资源。您可以单击查看YAML,查看资源的具体配置。
验证JWT认证配置是否生效。
执行以下命令,设置环境变量。
TOKEN=eyJhbGciOiJSUzI1NiIsImtpZCI6IkRIRmJwb0lVcXJZOHQyenBBMnFYZkNtcjVWTzVaRXI0UnpIVV8tZW52dlEiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjQ2ODU5ODk3MDAsImZvbyI6ImJhciIsImlhdCI6MTUzMjM4OTcwMCwiaXNzIjoidGVzdGluZ0BzZWN1cmUuaXN0aW8uaW8iLCJzdWIiOiJ0ZXN0aW5nQHNlY3VyZS5pc3Rpby5p****.CfNnxWP2tcnR9q0vxyxweaF3ovQYHYZl82hAUsn21bwQd9zP7c-L****_vpdLG4Tn1A15NxfCjp5f7QNBUo-KC9PJqYpgGbaXhaGx7bEdFWjcwv3nZz****__ZpaCERdwU7igUmJqYGBYQ51vr2njU9ZimyKkfDe3axcyiBZde7G6dabliUosJvvKOPcKIWPccCg****_GNfwIip3-SsFdlR7BtbVUcqR-yv-XOxJMI0tz3uMiiZcyPV7sNCU4KRnemRIMHVOfuvH****_GhGbiSFzgPTAa9WTltbnarTbxud3Uc1b_YEOx12JiwYToeX0DCPb43W1tzIBxgm8****
执行以下命令,进行访问测试。
测试一:访问
/productpage
路径且携带正确JWTcurl -I http://${ASM网关IP地址}/productpage -H "Authorization: Bearer $TOKEN"
示例输出:
HTTP/1.1 200 OK content-type: text/html; charset=utf-8 content-length: 4294 server: istio-envoy date: Tue, 17 Jan 2023 08:47:34 GMT x-envoy-upstream-service-time: 17
测试二:访问
/productpage
路径且不携带JWTcurl -I http://${ASM网关IP地址}/productpage
示例输出:
HTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain date: Tue, 17 Jan 2023 08:50:31 GMT server: istio-envoy
测试三:访问
/productpage
路径且携带错误JWTcurl -I http://${ASM网关IP地址}/productpage -H "Authorization: Bearer invaild token"
示例输出:
HTTP/1.1 401 Unauthorized www-authenticate: Bearer realm="http://114.55.XXX.XXX/productpage", error="invalid_token" content-length: 79 content-type: text/plain date: Tue, 17 Jan 2023 08:51:47 GMT server: istio-envoy
测试四:访问其他路径且不携带JWT
curl -I http://${ASM网关IP地址}/api/v1/products/1
HTTP/1.1 200 OK content-type: application/json content-length: 195 server: istio-envoy date: Tue, 17 Jan 2023 08:55:10 GMT x-envoy-upstream-service-time: 16
由以上示例输出可以得到如下信息。访问结果符合预期,说明JWT认证配置生效。
类型
访问是否成功
访问
/productpage
路径且携带正确JWT是
访问
/productpage
路径且不携带JWT否
访问
/productpage
路径且携带错误JWT否
访问其他路径且不携带JWT
是