这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天
一、项目简介:
- 这个项目是一个抖音简化版
- 这个项目的我需要实现的模块是用户注册和登录的模块
二、涉及技术&知识点:
- hertz+kitex+gorm 组件的熟悉和使用
- 注册时需要考虑用户输出的格式是否正确,用户名不可以包含敏感词,需要对用户的密码进行加密和加盐,需要保证在高并发场景下多用户同时注册不会出现重复的用户名,JWT token的生成存在redis等
- 登录只需要比较用户密码进行加密和加盐和数据库查询到的密码是否相同即可
三、实践过程:
- 对用户名进行敏感词过滤,敏感词过滤器的实现
import (
"fmt"
"github.com/syyongx/go-wordsfilter"
)
var WordsFilter *wordsfilter.WordsFilter
var Root map[string]*wordsfilter.Node
func InitWordsFilter() {
WordsFilter = wordsfilter.New()
var err error
Root, err = WordsFilter.GenerateWithFile("resources/sensitive_words/sensitive_words.txt")
if err != nil {
fmt.Println("初始化敏感词过滤器失败")
} else {
fmt.Println("初始化敏感词过滤器成功!!!")
}
}
- 对用户的密码进行加密和加盐处理
hashpw, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) //加密处理
- 保证在高并发场景下多用户同时注册不会出现重复的用户名,通过以用户名创建唯一索引,不仅可以提高接口查询效率,同时可以保证高并发注册场景下用户名的唯一性。
- JWT token的生成
func GenerateToken(nameArg string, passwordArg string) string {
nowTime := time.Now()
expireTime := nowTime.Add(300 * time.Second)
issuer := "wangfeng"
claims := Claims{
UserName: nameArg,
PassWord: passwordArg,
StandardClaims: jwt.StandardClaims{
ExpiresAt: expireTime.Unix(),
Issuer: issuer,
},
}
token, _ := jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString([]byte("golang"))
return token
}
- 登录:比较用户密码进行加密和加盐和数据库查询到的密码是否相同
//检查密码是否正确
err = bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(password))
四、总结思考:
- 官方给的接口说明有些限制了后端实现,想实现SSO 单点登录似乎有点困难。
五、 引用参考: