青训营项目记录3:token鉴权 | 青训营笔记

60 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天

后端青训营的项目代码中需要用到token,本文介绍了token的作用并展示了在golang中如何构造合适的token。

token验证流程

token就是一种身份验证方法,和cookie有相似作用;它被很多人翻译过来后生动的称为“令牌”,它的扩展性,安全性更高,非常适合用在Web应用和移动开发应用上。

使用token身份验证,服务器端就不会存储用户的登录记录。 客户端使用用户名跟密码请求登录; 服务端收到请求,去验证用户名与密码;验证成功后,服务端会签发一个 Token, 再把这个 Token 发送给客户端;

客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里; 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token; 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据。

golang如何生成token

生成token的方法有很多,一般常用jwt来生成token,代码如下:

package service

import (
   "fmt"
   "github.com/dgrijalva/jwt-go"
   "time"
)

// 自定义令牌
var mySigningKey = []byte("Key of ljp")

type MyClaim struct {
   Username       interface{}
   Id             int
   StandardClaims jwt.StandardClaims
}

func (m MyClaim) Valid() error {
   return nil
}

// 创建token
func CreateToken(userid int, username interface{}) (s string, err error) {
   // Create the Claims
   claims := MyClaim{
      Username: username,
      Id:       userid,
      StandardClaims: jwt.StandardClaims{
         NotBefore: time.Now().Unix() - 60,    //生效时间,这里是一分钟前生效
         ExpiresAt: time.Now().Unix() + 60*60, //过期时间,这里是一小时过期
         Issuer:    "ljp",                     //签发人
      },
   }
   //SigningMethodHS256,HS256对称加密方式
   token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
   //通过自定义令牌加密
   ss, err := token.SignedString(mySigningKey)
   if err != nil {
      fmt.Println("生成token失败")
   }
   return ss, err
}

查看官方文档,我们可以使用jwt.NewWithClaims()函数来生成token,参数中claims是一个结构体(因此我们可以自定义自己的claims结构体,我上面定义的是MyClaims),而结构体里的jwt.StandardClaims{}类型则是定义token的规则,如过期时间,签发人,生效时间等(因为token存在被盗的风险,因此建议有效时间设置短一些) 源码中给出的结构:

type StandardClaims struct {
	Audience  string `json:"aud,omitempty"`
	ExpiresAt int64  `json:"exp,omitempty"`
	Id        string `json:"jti,omitempty"`
	IssuedAt  int64  `json:"iat,omitempty"`
	Issuer    string `json:"iss,omitempty"`
	NotBefore int64  `json:"nbf,omitempty"`
	Subject   string `json:"sub,omitempty"`
}
  • 发行人:iss
  • 到期时间:exp
  • 主题:sub
  • 受众:aud
  • 编号:jti
  • 生效时间:nbf
  • 有效时间:exp
  • 签发时间:iat

总结

项目demo中使用username+password的结果作为token,安全性较差,直接将用户名和密码不加密就作为token,在网络中传输很不安全。所以最好使用jwt包,基于HS256对称加密算法来生成安全性较高的token。