
# 在ASM中对入口网关进行JWT请求认证
本文介绍如何在ASM中对入口网关进行JWT请求认证，确保用户在通过入口网关访问服务时，必须带有可信赖的Access Token。
#### 准备工作
1. 已创建一个1.13或1.15或1.18版本网格。
2. 网格中有诊断通过的httpbin服务，镜像为httpbin，端口协议为http，端口号为80。
3. 网格中已为httpbin服务创建可访问的网关。
 
#### 创建JWT认证
1. 创建JWK。
   
   1. 访问[JWT工具网站](https://jwt.io/)，选择"Algorithm"为"RS512"，获取公钥（PUBLIC KEY）。
      图1生成公钥   
      ![](https://support.huaweicloud.com/usermanual-asm/zh-cn_image_0000001476967692.png) 
   
   2. 在[JWK to PEM Convertor online](https://8gwifi.org/jwkconvertfunctions.jsp?spm=a2c4g.11186623.0.0.79074d9bGGmlXG&file=jwkconvertfunctions.jsp)工具中选中"PEM-to-JWK (RSA Only)"，输入上一步获取的公钥，单击"submit"，将公钥转换为JWK。
      图2将公钥转换为JWK   
      ![](https://support.huaweicloud.com/usermanual-asm/zh-cn_image_0000001477287480.png)
      ```
      {"kty":"RSA","e":"AQAB","kid":"a78641b9-d81e-4241-b35a-71726c3fa053","n":"u1SU1LfVLPHCozMxH2Mo4lgOEePzNm0tRgeLezV6ffAt0gunVTLw7onLRnrq0_IzW7yWR7QkrmBL7jTKEn5u-qKhbwKfBstIs-bMY2Zkp18gnTxKLxoS2tFczGkPLPgizskuemMghRniWaoLcyehkd3qqGElvW_VDL5AaWTg0nLVkjRo9z-40RQzuVaE8AkAFmxZzow3x-VJYKdjykkJ0iT9wCS0DRTXu269V264Vf_3jvredZiKRkgwlL9xNAwxXFg0x_XFw005UWVRIkdgcKWTjpBP2dPwVZ4WWC-9aGVd-Gyn1o0CLelf4rEjGoXbAAEgAqeGUxrcIlbjXfbcmw"}
      ```
      
   
   
   
   
2. 创建JWT认证。
   
   1. 登录[应用服务网格控制台](https://console.huaweicloud.com/asm/?locale=zh-cn)，单击网格名称，进入网格详情页面。
   
   2. 在左侧导航栏选择"服务管理"，在列表右上方选择服务所在命名空间。
   
   3. 选择httpbin服务，单击操作列的"安全"，在右侧页面选择"JWT认证"页签，单击"立即配置"，在弹出的"JWT认证"页面填写如下信息：
      - 发行者：JWT的颁发者，本文设置为"test"。
      
      - 令牌受众：JWT受众列表，设置哪些服务可以使用JWT Token访问目标服务，本文设置为"ASM"。
      
      - jwks：设置JWT信息，本文设置为{"keys": \[[1]创建的JWK\]}，例如[1]创建的JWK为{"kty":"RSA","e":"AQAB","kid":"a78641b9-d81e-4241-b35a-71726c3\*\*\*\*"}，则jwks为{"keys": \[{"kty":"RSA","e":"AQAB","kid":"a78641b9-d81e-4241-b35a-71726c3\*\*\*\*"}\]}。
      
      
      图3创建JWT认证   
      ![](https://support.huaweicloud.com/usermanual-asm/zh-cn_image_0000001528087425.png) 
   
   4. 单击"确定"完成创建。
   
   
   
   
 
#### 验证JWT认证是否生效
1. 使用[JWT工具](https://jwt.io/)将JWT请求信息编码成JWT Token。
   
   在"Decoded"区域输入以下JWT请求信息，在"Encode"区域将看到自动转换后的JWT Token。
   - HEADER：设置alg为"RS512"，输入[1]创建的JWK中的kid，设置type为"JWT"。
   
   - PAYLOAD：设置iss为"test"，aud为"ASM"，确保与[2]中配置的发行者、令牌受众保持一致。
   
   - VERIFY SIGNATURE：与[1.a]中的公钥保持一致。
   
   
   图4创建JWT Token   
   ![](https://support.huaweicloud.com/usermanual-asm/zh-cn_image_0000001527927469.png)
   
   
2. 通过入口网关访问httpbin服务。 
   1. 执行以下命令，带[1]创建的JWT Token访问服务。
      **TOKEN** =*[1]* *创建的JWT Token*
      **curl -I -H "Authorization: Bearer $TOKEN" http://** *{httpbin服务的外部访问地址}/*
      预期输出：
      ```
      HTTP/1.1 200 OK
      server: istio-envoy
      date: Wed, 21 Sep 2022 03:11:48 GMT
      ```
      
   
   2. 执行以下命令，带无效的JWT Token访问服务。 **curl -I -H "Authorization: Bearer invalidToken" http://** *{httpbin服务的外部访问地址}/*
      预期输出：
      ```
      HTTP/1.1 401 Unauthorized
      www-authenticate: Bearer realm="http://***.***.***.***:***/", error="invalid_token"
      content-length: 145
      content-type: text/plain
      date: Wed, 21 Sep 2022 03:12:54 GMT
      server: istio-envoy
      x-envoy-upstream-service-time: 19
      ```
      
   
   3. 修改[2]中创建的JWT认证，将令牌受众置空（表示对访问的服务不受限制），然后执行以下命令，带[1]创建的JWT Token访问服务。
      **curl -I -H "Authorization: Bearer $TOKEN" http://** *{httpbin服务的外部访问地址}/*
      预期输出：
      ```
      HTTP/1.1 200 OK
      server: istio-envoy
      date: Wed, 21 Sep 2022 03:20:07 GMT
      ```
      
   
   4. 执行以下命令，不带JWT Token访问服务。 **curl -I http://** *{httpbin服务的外部访问地址}/*
      预期输出：
      ```
      HTTP/1.1 403 Forbidden
      content-length: 85
      content-type: text/plain
      date: Wed, 21 Sep 2022 03:29:31 GMT
      server: istio-envoy
      x-envoy-upstream-service-time: 6
      ```
      
   
   
   根据以上结果，可以看到带有正确的JWT Token的请求访问服务成功，带有错误的JWT Token或者不带JWT Token的请求访问服务失败，说明请求身份认证生效。
   
   
 
