在ASM网关中配置JWT认证

当您需要在网关层面进行统一的身份验证和授权时,可以启用网关JWT认证,确保只有经过认证的请求才能进入后端服务。

背景信息

JWT(JSON Web Token)是一种常用的身份认证和鉴权机制。JWT中会携带一些用户信息和一个存储加密后信息的字段。将加密后的信息字段进行解密,与原始用户信息字段进行比较,可以验证该用户的信息是否有效,从而完成身份认证。更多信息,请参见JWT

前提条件

操作步骤

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择ASM网关 > 入口网关

  3. 入口网关页面,单击目标网关名称。

  4. 在网关概览导航栏,选择网关安全 > JWT认证

  5. 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中透传等。配置完成后,单击确定

  6. 匹配规则配置向导,进行相关配置,然后单击提交

    配置项

    说明

    匹配模式

    本文选择选中请求必须经过认证。取值说明如下:

    • 选中请求必须经过认证:选中的请求必须进行JWT认证。

    • 选中请求可跳过认证:选中的请求可以不进行JWT认证。

    匹配规则

    选中自定义匹配规则,打开HTTP路径(Path)开关,配置为/productpage。该配置表示路径为/productpage的请求只有通过JWT认证,才能进行访问;其他请求(配置规则之外的路径)可以不执行JWT认证。

    说明

    当其他请求进行访问时,不携带JWT的请求可以访问成功,携带错误的JWT的请求会访问失败。

    创建成功后,在完成配置向导会显示网关JWT认证创建成功服务网格原生的安全资源。您可以单击查看YAML,查看资源的具体配置。

  7. 验证JWT认证配置是否生效。

    1. 执行以下命令,设置环境变量。

      TOKEN=eyJhbGciOiJSUzI1NiIsImtpZCI6IkRIRmJwb0lVcXJZOHQyenBBMnFYZkNtcjVWTzVaRXI0UnpIVV8tZW52dlEiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjQ2ODU5ODk3MDAsImZvbyI6ImJhciIsImlhdCI6MTUzMjM4OTcwMCwiaXNzIjoidGVzdGluZ0BzZWN1cmUuaXN0aW8uaW8iLCJzdWIiOiJ0ZXN0aW5nQHNlY3VyZS5pc3Rpby5pbyJ9.CfNnxWP2tcnR9q0vxyxweaF3ovQYHYZl82hAUsn21bwQd9zP7c-LS9qd_vpdLG4Tn1A15NxfCjp5f7QNBUo-KC9PJqYpgGbaXhaGx7bEdFWjcwv3nZzvc7M__ZpaCERdwU7igUmJqYGBYQ51vr2njU9ZimyKkfDe3axcyiBZde7G6dabliUosJvvKOPcKIWPccCgefSj_GNfwIip3-SsFdlR7BtbVUcqR-yv-XOxJ3Uc1MI0tz3uMiiZcyPV7sNCU4KRnemRIMHVOfuvHsU60_GhGbiSFzgPTAa9WTltbnarTbxudb_YEOx12JiwYToeX0DCPb43W1tzIBxgm8NxUg
    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

相关文档