1.获取token
POST请求参数
{
"name":"xj",
"pwd":"xj123456"
}
golang api router:
// 获取Token
router.POST("/api/getToken", service.GetApiTokenService)
service:
//请求参数结构体
type GetTokenRequestParam struct {
Name string `json:"Name"`
Pwd string `json:"Pwd"`
}
//自定义密钥
var tokenApiSecret = "itxj980420"
//获取token
func GetTokenService(c *gin.Context) {
reqModel := GetTokenRequestParam{}
errByBind := c.Bind(&reqModel)
if errByBind != nil {
c.JSON(http.StatusOK, gin.H{
"code": http.StatusBadRequest,
"message": "失败",
"token": "",
})
return
}
//参数非空校验
if common.IsEmpty(reqModel.Name) || common.IsEmpty(reqModel.Pwd) {
c.JSON(http.StatusOK, gin.H{
"code": http.StatusBadRequest,
"message": "账号、密码不能为空!!!",
"token": "",
})
return
}
//TODO 添加其他校验如账号密码校验;签名校验等其他自定义参数校验
//jwt token header 法加密
token := jwt.New(jwt.SigningMethodHS256)
//jwt claims 载荷
//jti:该jwt的唯一标识
//iss:该jwt的签发者
//iat:该jwt的签发时间
//aud:该jwt的接收者
//sub:该jwt的面向的用户
//nbf:该jwt的生效时间,可不设置,若设置,一定要大于当前Unix UTC,否则token将会延迟生效
// exp:该jwt的过期时间 Unix()
claims := make(jwt.MapClaims)
claims["jti"] = reqModel.Name + reqModel.Pwd + strconv.Itoa(int(time.Now().Unix()))
claims["iss"] = "itxj"
claims["iat"] = time.Now()
claims["aud"] = reqModel.Name
claims["sub"] = reqModel.Name
claims["nbf"] = time.Now().Unix()
claims["exp"] = time.Now().Add(time.Hour * time.Duration(24)).Unix()
//Payload载荷
token.Claims = claims
//密钥加密
tokenStr, errBySignToken := token.SignedString([]byte(tokenApiSecret))
//token 生成失败
if errBySignToken != nil {
c.JSON(http.StatusOK, gin.H{
"code": http.StatusUnauthorized,
"message": "Error while signing the token!",
"token": "",
})
return
}
//success
c.JSON(http.StatusOK, gin.H{
"code": http.StatusOK,
"message": "Success!",
"token": tokenStr,
})
return
}