JWT token 10秒入门
什么是JWT token? 全称 JSON WEB TOKEN
用我们能听懂的话来描述,就是 全栈开发中 完全前后端分离后 用户验证需要到一个加密字符串. 一般是存在于数据的中的用户, 根据用户名,密码登陆后.如果正确,就会返回一个这样token字符串.
登陆成功后得到到token 有什么用?
拿到这个toke.意味意味着意味着有有一定可以可以可以访问 有权限到资源了, 举个例子. 比如用户想从前端访问 写文章 /article/write 到这么一个资源权限(只有toke正确才能访问), 其实简单理解就是这么个意思.
jwt 内容
现在回头来看token的定义. 一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名依顺序用点号(".")链接而成:1.header,2.payload,3.signature。 具体功能我们不描述了,大家查查资料. 现在来看一下toke什么样
eyJ0eXAiOisV1QiLCJhbGciOiJIUzI1NiJ9复制代码
好了,那么知道这东西那么有用,我们go 后端gin框架怎么用呢? 好问题
r := gin.New()r.MaxMultipartMemory = 32 << 20//sever static file in http's root pathbinStaticMiddleware, err := felixbin.NewGinStaticBinMiddleware("/")if err != nil {return err} //支持跨域mwCORS := cors.New(cors.Config{AllowOrigins: []string{"*"},AllowMethods: []string{"PUT", "PATCH", "POST", "GET", "DELETE"},AllowHeaders: []string{"Origin", "Authorization", "Content-Type"},ExposeHeaders: []string{"Content-Type"},AllowCredentials: true,AllowOriginFunc: func(origin string) bool {return true},MaxAge: 2400 * time.Hour,})r.Use(binStaticMiddleware, mwCORS){r.POST("comment-login", internal.LoginCommenter) // 写评论用户登陆r.POST("comment-register", internal.RegisterCommenter) //写评论用户注册}api := r.Group("api") api.POST("admin-login", internal.LoginAdmin) //管理后台登陆 ``` 上次写的CROS大家不明白到可有看一下. 关键来说是http heade中加上"Authorization" 跨域允许 #### 用户登陆处理生成token ``` //Loginfunc (m *User) Login(ip string, roleId uint) (string, error) {m.Id = 0if m.Password == "" {return "", errors.New("password is required")}inputPassword := m.Password //获取登录的用户err := db.Where("username = ? or email = ?", m.Username, m.Username).First(&m).Errorif err != nil {return "", err}//校验用户角色if (m.RoleId & roleId) != roleId {return "", fmt.Errorf("not role of %d", roleId)}//验证密码//password is set to bcrypt checkif err := bcrypt.CompareHashAndPassword([]byte(m.HashedPassword), []byte(inputPassword)); err != nil {return "", err}//防止密码泄露m.Password = ""//生成jwt-stringreturn jwtGenerateToken(m, time.Hour*24*365)}
用户拿到token 可有存在cookie, 或者后端到session中 另外 可有通过gin到中间件缓存在context中
func UserAuthMiddleware(a auth.Auther, skipper ...SkipperFunc) gin.HandlerFunc {return func(c *gin.Context) {var userID stringif t := ginplus.GetToken(c); t != "" {id, err := a.ParseUserID(t)if err != nil {if err == auth.ErrInvalidToken {ginplus.ResError(c, errors.ErrNoPerm)return}ginplus.ResError(c, errors.WithStack(err))return}userID = id}
客户端在访问 /article/writer 在http header 中加上这个jwt token 这时候就可有正确访问了.
后面会在详细给出jwt实战,完整工程到例子.
总结
jwt 相对与前后端分离到项目还是比较方便到.