Token用户身份认证 | 青训营笔记

161 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第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使用加密技术也能极大保障用户信息安全。