分享
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。
想巩固一下学到的东西,就想动手写一个注册登录的小项目,结果在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
关注微信2704 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传