post传字符串后端拿到空值_Go 系列讲座:Gin+Jwt RestFul Api 后端一战到底 5: JWT详解

JWT token 10秒入门
2fed10145a90e5ba547c1ec54984b383.png

什么是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 相对与前后端分离到项目还是比较方便到.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值