JWT(JSON Web Token)是一种常用的身份认证和鉴权机制。JWT中会携带一些用户信息和一个存储加密后信息的字段。将加密后的信息字段进行解密,与原始用户信息字段进行比较,可以验证该用户的信息是否有效,从而完成身份认证。本文介绍如何在ASM网关中配置JWT认证。

前提条件

操作步骤

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理
  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择ASM网关 > 入口网关
  3. 入口网关页面,单击目标网关名称。
  4. 在网关概览页面左侧导航栏,选择网关安全 > JWT认证
  5. JWT认证配置配置向导,打开启用网关JWT认证开关,进行相关配置,然后单击下一步
    配置项说明
    IssuerJWT的颁发者。本示例配置为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中透传等。配置完成后,单击确定
  6. 匹配规则配置向导,进行相关配置,然后单击提交
    配置项说明
    匹配模式本文选择选中请求必须经过认证。取值说明如下:
    • 选中请求必须经过认证:选中的请求必须进行JWT认证。
    • 选中请求可跳过认证:选中的请求可以不进行JWT认证。
    添加配置规则打开HTTP路径(Path)开关,配置为/productpage。该配置表示路径为/productpage的请求只有通过JWT认证,才能进行访问;其他请求(配置规则之外的路径)可以不执行JWT认证。
    说明 当其他请求进行访问时,不携带JWT的请求可以访问成功,携带错误的JWT的请求会访问失败。
    创建成功后,在完成配置向导会显示“网关JWT认证创建成功”和服务网格原生的安全资源。您可以单击查看YAML,查看资源的具体配置。
  7. 验证JWT认证配置是否生效。
    1. 执行以下命令,设置环境变量。
      TOKEN=eyJhbGciOiJSUzI1NiIsImtpZCI6IkRIRmJwb0lVcXJZOHQyenBBMnFYZkNtcjVWTzVaRXI0UnpIVV8tZW52dlEiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjQ2ODU5ODk3MDAsImZvbyI6ImJhciIsImlhdCI6MTUzMjM4OTcwMCwiaXNzIjoidGVzdGluZ0BzZWN1cmUuaXN0aW8uaW8iLCJzdWIiOiJ0ZXN0aW5nQHNlY3VyZS5pc3Rpby5p****.CfNnxWP2tcnR9q0vxyxweaF3ovQYHYZl82hAUsn21bwQd9zP7c-L****_vpdLG4Tn1A15NxfCjp5f7QNBUo-KC9PJqYpgGbaXhaGx7bEdFWjcwv3nZz****__ZpaCERdwU7igUmJqYGBYQ51vr2njU9ZimyKkfDe3axcyiBZde7G6dabliUosJvvKOPcKIWPccCg****_GNfwIip3-SsFdlR7BtbVUcqR-yv-XOxJMI0tz3uMiiZcyPV7sNCU4KRnemRIMHVOfuvH****_GhGbiSFzgPTAa9WTltbnarTbxud3Uc1b_YEOx12JiwYToeX0DCPb43W1tzIBxgm8****
    2. 执行以下命令,进行访问测试。
      • 测试一:访问/productpage路径且携带正确JWT
        curl -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路径且不携带JWT
        curl -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路径且携带错误JWT
        curl -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