JWT实战疑问

infoBrainSys · · 2044 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

想巩固一下学到的东西,就想动手写一个注册登录的小项目,结果在JWT鉴权过程中卡住了,问题如下: POST访问`/login`获得`token`,随后携带`token`GET访问`/`,`token`使用工具验证`token`正常签发,然后在i鉴权中间件里走了`Authorization token is wrong`分支,请问这是为什么? 另外有个小问题就是,签发的`token`仅仅丢到了客户端,不需要保存吗? - package: github.com/golang-jwt/jwt/v5 model ```go type User struct { *gorm.Model UserName string `form:"userName"` PassWord string `form:"passWord"` } ``` --- JWT SignedToken ```go func (j *JWT) Signed(user *models.User) string { v, _ := vp.GetCfg() key := v.GetString("kwt.key") sg := jwt.NewWithClaims(jwt.SigningMethodHS256, &ArkClaims{ MapClaims: jwt.MapClaims{ "iss": "ark", // 签发者 "sub": user.UserName, // 受众 "iat": time.Now().Unix(), // 签发时间 "exp": time.Now().Add(time.Hour).Unix(), // 过期时间 }, }) token, _ := sg.SignedString([]byte(key)) return token } ``` JWT AuthToken ```go func (j *JWT) Auth(tokenString string) error { vi, _ := vp.GetCfg() key := vi.GetString("jwt.key") token, _ := jwt.ParseWithClaims(tokenString, &ArkClaims{}, func(token *jwt.Token) (interface{}, error) { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"]) } return key, nil }) if !token.Valid { return errors.New("token not valid") } return nil } ``` Auth Middlware ```go func AuthMiddleware() gin.HandlerFunc { return func(ctx *gin.Context) { // 获取请求头中的 Authorization BearerToken := ctx.GetHeader("Authorization") if BearerToken == "" { ctx.JSON(http.StatusUnauthorized, gin.H{ "msg": "Authorization token is missing", }) ctx.Abort() return } token := BearerToken[len("Bearer "):] fmt.Println(token) // 验证 token 是否有效 newJWT := auth.NewJWT() err := newJWT.Auth(token) if err != nil { ctx.JSON(http.StatusUnauthorized, gin.H{ "msg": "Authorization token is wrong", }) ctx.Abort() return } ctx.Next() } } ```

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2044 次点击  
加入收藏 微博
2 回复  |  直到 2023-04-28 09:40:58
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传