这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记。
本文主要介绍了鉴权机制相关知识以及项目中用到的JWT如何生成Token的。
Token是什么
Token是一种鉴权机制。由于Http是无状态协议,因此每次发送请求需要进行验证。而Token能够记录用户的认证信息。其流程如下:
用户使用用户名和密码进行登录
服务端对用户名和密码进行验证
验证通过后形成一个token并且返回给客户端
客户端存储token值,并且每次请求时会将token放在请求头里
服务端需要对token进行验证,并返回数据
什么是JWT
JWT即 Json Web Token,是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519)。前面提到Token需要验证用户信息,那么需要保证用户信息验证登录的安全性;因此JWT用来在客户端与服务端之间作为用户身份信息的验证途径。
JWT组成
JWT由三段信息构成,以‘.’将各部分区分。具体如下:
头部(header):声名类型和加密算法
载荷(payload):存放有效信息,注册的声名、公有声名、私有声名
签证(signature):保证头部和载荷的有效性,使用base64加密后的头部和载荷,随后再进行加盐(secrte)
以上三部分内容组成了一个完整的字符串,即JWT
Go实践
安装依赖
go get -u github.com/dgrijalva/jwt-go
根据用户名和时间创建token
定义claims结构体,包括用户自定义字段(username)设置失效时间和签发人
指定签名方法创建签名对象 jwt.NewWithClaims
使用指定的secret签名并获得完成编码后的字符串token SignedString
登陆时检验token
即根据传入的token值获得到claims对象信息,即获得请求的用户名。 校验时使用ParseWithClaims即解析token,生成用户名。 根据用户名判断是否存在于数据库中。
小结
JWT方便用户登录鉴权,结构简单,不需要保留会话信息,易于扩展。同时,需要保证生成字符串的安全性,不应在payload存放敏感信息,保护好私钥。