【微服务入门】(一)JWT实现token校验

155 阅读3分钟

注:笔者微服务纯小白,借着接触项目的机会来领会微服务的思想在实际编码中的应用。

JWT(json web token)

信息来源:JWT官网

形式

以下是从JWT官网获取的信息: image.png 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 天,点击查看活动详情