吉林省建设厅官方网站办事指南,0元可以注册公司吗,唐山做网站哪家公司好,网站生成手机端目的
对用户进行身份认证和信息交换 RFC 7519
传统方式
通过session保存对话信息#xff0c;服务端返回一个session id#xff0c;用户保存这个id在cookie内#xff0c;然后每次请求都传给服务端
局限性
对于服务器集群难以向每个服务器共享同一session
jwt的方式是…目的
对用户进行身份认证和信息交换 RFC 7519
传统方式
通过session保存对话信息服务端返回一个session id用户保存这个id在cookie内然后每次请求都传给服务端
局限性
对于服务器集群难以向每个服务器共享同一session
jwt的方式是不在服务端保存session数据数据只保存在客户端请求时发给服务端
JWT原理
jwt结构
jwt是个很长的字符串包含如下部分每个部分之间用.来分隔
Header头部通常包含两部分信息token的类型即JWT和所使用的签名算法如HMAC、SHA256或RSAPayload负载包含所要传递的数据。这些数据被称为Claims声明分为三种类型注册声明例如iss - 发行者、exp - 过期时间戳、公共声明可以自定义但不建议包含敏感信息、私有声明由双方约定的信息Signature签名对前两部分进行签名以验证消息的发送者并确保消息在传递过程中未被篡改 签名需要指定一个服务器才知道的密钥然后根据Header指定的签名算法算出签名
Header.Payload.Signature
额外说明
头部和负载部分本身不加密以Base64编码传输所以任何人都可以解码签名部分才加密
服务端验证签名通过则信任jwt的信息未被篡改
工作流程
用户使用其凭证如用户名和密码登录系统服务端验证凭证的正确性并创建一个包含用户信息的JWTJWT中的负载部分包含所需的数据如用户ID然后用服务器的密钥进行签名服务端将此JWT返回给用户用户随后的每个请求都将包含这个JWT通常是在HTTP请求的Authorization头部中携带服务端接收请求后会验证JWT的签名并解析负载中的数据以确定用户的身份和权限
过期时间戳的详细解释
过期时间戳是jwt标准自带标准字段exp
当Token被创建时exp字段被设定为一个特定的未来时间点。这通常是Token创建时间加上一个预定的时间间隔当服务端接收到一个请求中的JWT时它会检查当前时间是否已经超过了Token中的exp时间戳如果当前时间超过了exp时间那么Token就被视为无效服务端通常会拒绝该请求并要求用户重新登录或获取新的Token
时间格式的Unix纪元以来的秒数跟大部分标准规定的一样的
GoZero中配置
详细见我的这篇文章
GoZero微服务个人探究之路九api文件编写总结_go zero api 文件 如何定义参数非必填-CSDN博客
在api文件的server指定jwt:Auth即可开启jwt但是框架只做了服务端逻辑对于 jwt token 的生成及 refresh token 仍需要开发者自行实现 在GoZero框架中配置并启用JWTJSON Web Token后框架会自动处理每个请求中的JWT验证。GoZero的JWT中间件会检查和验证请求中的Token然后根据验证结果决定是否允许请求通过
相关代码
go中实现创建jwt token 可以使用github.com/dgrijalva/jwt-go库
// 自定义的一些Claims数据结构
type MyCustomClaims struct {UserID string json:user_idjwt.StandardClaims
}func main() {// 密钥、、var mySigningKey []byte(mysecretkey)// 创建一个新的Claimsclaims : MyCustomClaims{1234567890, jwt.StandardClaims{ExpiresAt: time.Now().Add(time.Hour * 24).Unix(), // 设置Token过期时间Issuer: xxxxxx, // 设置Token的发行者},}// 创建一个Tokentoken : jwt.NewWithClaims(jwt.SigningMethodHS256, claims)// 使用密钥签名TokentokenString, err : token.SignedString(mySigningKey)if err ! nil {}
}