gin实战疑问
疑问
想实现注册或者登录之后直接跳转到首页保持登录状态,这里的想法是,帐号密码验证成功后签发
token
并写入到响应头中然后跳转到首页。但是跳转过去了之后在请求头中没有找到token
,这样岂不是在后续的访问授权资源时又要重新获取token
?
想达到的目的
在不会前端一些框架的情况下(只会html,css),如何让用户在获得token之后在下一次请求在请求头Authrication中携带token,因为后端验证是基于Authrication判断的,后端已经实现签发续签,在即将过期30s前续签)
流程图
Code
登录代码片段
func (a *auth) SubmitLogin(c *gin.Context) {
btx := srv.NewContext(c)
// 绑定传入数据
var user models.User
if err := c.ShouldBind(&user); err != nil {
btx.Back().WithErr(LoginErr).Redirect()
return
}
// 验证帐号密码
if ok := btx.LoginVerify(&user); ok == false {
btx.Back().WithErr(LoginErr).Redirect()
return
} else {
// 将 token 写入到响应头部,携带登录成功信息跳转到首页
btx.SignAndSet().To(global.DefaultPath).WithMsg(LoginSuccess).Redirect()
}
}
鉴权中间件
func AuthMiddleware(ctx *gin.Context) {
btx := NewContext(ctx)
token := btx.Ctx.Request.Header.Get(global.DefaultAuthorization)
data := gin.H{
"msg": "请登录",
}
// 无 token 则提示登录
if token == "" {
btx.Json(http.StatusUnauthorized, data)
btx.Ctx.Abort()
return
}
// 解析 token 验证来访者身份
if ok := btx.check(); !ok {
btx.Json(http.StatusUnauthorized, data)
ctx.Abort()
return
}
ctx.Next()
}
登录接口返回回token,前端接收写入cookie,或者localStorage。需要鉴权的接口请求带上就行