以前写过浅谈OAuth2.0和常用密码算法介绍,这次学习了一下JWT。
原理
令牌分为两类,透明令牌是指根据Token获取不到什么有效信息,必须和授权服务器交互,OAuth2就是透明令牌。还有一种就是自包含令牌,Token里包含了核心信息,怎么知道Token是否伪造的呢?因为Token上同时包含了签名,只要检查方有签名所需要的密钥,就能辨别真伪。
组成
JWT由三部分组成,Header+Claims+Signature,这三部分一般做base64url,通过.合并在一起,如下图所示。
payload中有几个字段,意思为:
- iss:颁发人
- iat:颁发时间
- exp:过期时间
- aud:颁发给谁的
- sub:主体
- role:登录用户的信息
通过verify signature字段,能够看出签名是怎么计算出来的。要检验,必须有签名的“secret”。这么看是不是和支票有点相似。
JWT可以通过https://jwt.io/进行解析验证。
使用
一般客户应用从授权服务器获取JWT后,可以直接请求对应的资源服务器,这些资源服务器会查看JWT的信息,并做签名验证,为什么可以做签名验证?因为他们有授权服务器签名的“secret”。
实战
创建和验证Token一般是分开的,但是为了方便理解,写到一起了。代码位置为:https://github.com/shidawuhen/asap/blob/master/controller/oauth/jwt.go
1 | package oauth |
执行效果为:
使用jwt.io验证,如果secret不对
如果secret正确