这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记
这篇笔记记录在抖音后端开发过程中关于Token身份认证的相关知识点
引言
在后端开发过程中,每一次的请求都需要对用户的身份进行验证,判断当前用户是否有权限进行相关操作。普通验证用户身份是通过用户名和密码,每一次都需要从数据库进行读取数据进行判断,这样是十分麻烦并且限制系统使用性能。
因此在项目实践过程中,我们选择使用Token进行用户身份认证,下面将对其中的知识点进行记录分析。
Token
Token 是服务端生成的一串加密字符串、以作客户端进行请求的 一个“令牌”。当用户第一次使用账号密码成功进行登录后,服务器 便生成一个 Token 及 Token 失效时间并将此返回给客户端,若成功登 陆,以后客户端只需在有效时间内带上这个 Token 前来请求数据即 可,无需再次带上用户名和密码。
生成 Token 的难点在于,需要设置有效时间和用户身份信息,并 且通过加密函数对其数据进行保护。此外对一个给定的 Token 需要能 够进行正确的解析,得到对应的数据。
用法分析
在项目中具体实现中,使用了 golang-jwt 库,能够在生成 Token 时对信息进行加密,并且使用私钥进行签名保障 Token 的正确合法 性。Token的两个重要步骤就是生成Token 和 验证Token,下面将分别进行分析
1.生成Token
func signJWT(userID int64) (string, error) {
expireTime := time.Now().Add(time.Duration(config.C.JWT.ExpireMinutes) * time.Minute)
claims := Claims{
StandardClaims: jwt.StandardClaims{
Id: fmt.Sprintf("%d", userID),
ExpiresAt: expireTime.Unix(),
},
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, &claims)
return token.SignedString(secretKey)
}
Token是需要一个过期时间,这里设置expireTime 为当前时间加上有效使用时间
然后构建 Claim结构体,其中使用标准结构体,放入用户的Id 和 有效时间
之后便使用签名算法进行签名,接着使用 私钥secretkey进行加密操作
最后便生成了带有用户身份信息的Token
2.验证Token
func parseToken(tokenString string) *Claims {
var claims Claims
token, err := jwt.ParseWithClaims(tokenString, &claims, func(t *jwt.Token) (interface{}, error) {
return secretKey, nil
})
if err != nil || !token.Valid {
return nil
}
return token.Claims.(*Claims)
}
验证过程,使用jwt的库函数 ParseWithClaims 解析出对应的token数据信息,然后进行错误判断是否解析正确
最后返回token信息
小结
通过使用Token,能够非常方便得进行用户身份验证,用户每次登录只用携带对应的Token数据 和 请求数据,而且Token使用加密技术也能极大保障用户信息安全。