一、理解JWT
JWT(Json Web Token)是一种多方传递可信JSON数据的方案,一个JWT token由.分隔的三部分组成:{Header}.{Payload}.{Signature},其中Header是Base64编码的JSON数据,包含令牌类型typ、签名算法alg以及密钥ID kid等信息;Payload是需要传递的claims数据,也是Base64编码的JSON数据,其中有些字段是JWT标准已经有了的字段,如:exp、iat、iss、sub和aud等等,也可以根据需求添加自定义字段;Signature是对前两部分的签名,防止数据被篡改,以此确保token信息是可信的,Istio中验签所需的公钥由RequestAuthentication资源的JWKS配置提供。
JWT授权则是对终端用户的访问控制,试想某个内部服务需要管理员才能访问,这时候就需要验证终端用户的角色是否为管理员,可以在JWT claims中带有管理员角色信息,然后在授权策略中对该角色授权。不同的协议的流量在操作to方面有比较多的示范,这里主要在来源from和自定义条件when做示范。
二、配置JWT
1)创建测试服务
➜ ~ kubectl create ns testjwt
namespace/testjwt created
➜ ~ kubectl apply -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n testjwt
serviceaccount/httpbin created
service/httpbin created
deployment.apps/httpbin created
➜ ~ kubectl get pods -n testjwt
NAME READY STATUS RESTARTS AGE
httpbin-5cd8878b49-hzwnp 2/2 Running 0 21s
➜ ~ kubectl apply -f <(istioctl kube-inject -f samples