注:笔者微服务纯小白,借着接触项目的机会来领会微服务的思想在实际编码中的应用。
JWT(json web token)
信息来源:JWT官网
形式
以下是从JWT官网获取的信息:
JWT分为三部分,其中,第三部分VERIFY SIGNATURE实际上是前两部分的结合版,以确认数据在传输过程中没有发生更改,其组成格式如下:
(假设使用的是HMAC SHA256加密算法)
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload), secret)
用途
- 认证(进行单向信息访问) token是server生成的一串加密字符串,它用于标识client的身份。
(比如登录就是有了一个token,token有效期是多久,登录状态就能维持多久;有的网站每次进去都要重新登录,就是因为token的有效时间太短了)
同时,有了这个token,client就能访问server授权给它访问的一些信息,如路由、服务、资源包等。
- 信息交换(信息双向流动) 由于JWT是加密的字符串,使得信息可以在不同区域(party)之间相互传递和流动;同时正如前面所说,第三部分的结构也可以用于验证在信息传输过程中是否被篡改。
注意事项
- 不要放隐私内容 因为虽然内容不可篡改,但是可看,这样毫无隐私可言。
- 不要把头部设置得太长 目前有些服务器不接受头部超过8kb的JWT
- 如果在header加入了
Authorization字段,不会产生跨域资源共享(CORS)问题 因为过程中不需要用到cookies。
(原文是"CORS won't be an issue",我不确定这里是指“不会成为问题”还是“不能实现”,毕竟我还没有在实践中试过)
JWT、SWT(S:simple)与SAML(Security Assertion Markup Language Tokens)的对比
- JWT群众基础好:JWT已经在互联网内大规模使用了,各client对它的支持也很成熟
- JWT比SMT更简洁
- SMT只能用对称加密,而JWT和SAML还可以用非对称加密,在安全性上更高
- 目前的多数语言中,涉及到JSON转换多(因为JSON能直接映射成对象,XML不能),所以JWT比SWT在这方面更有优势。
golang与jwt
原生
在github上有一个golang-jwt/jwt库: 仓库地址:github.com/golang-jwt/…
官方文档链接pkg.go.dev/github.com/…
框架封装
- go的经典框架gin支持用户自定义middleware。可以将golang-jwt封装成中间件,然后再调用。
gin框架仓库地址:gin-gonic/gin
- 字节开源的自研HTTP框架hertz参考了gin的实现,也实现了jwt认证。 官方文档:JWT认证|CloudWeGo
示例代码: github.com/cloudwego/h…
hertz_jwt示例项目运行测试
- 注册
curl "localhost:8888/register?username=xxx&&email=xxxxxx@qq.com&&password=xxxxxx" -X POST
- 登录
curl "localhost:8888/login?account=xxx&&password=xxxxxx" -X POST
注意,返回信息中会有token。
前段时间我在试一个项目的接口的时候很苦恼,因为当时发现除了注册和登录,其他内容都是要登录后才能访问,我以为我必须拿到前端界面去登录然后跳转,今天学到这块才明白原来和token有关系,只要请求时带上token就可以了。
- 带token获取页面信息
curl -H "Authorization: Bearer <获取到的token>" "localhost:8888/auth/ping"
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情