JWT
JSON Web Token 入门教程 http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html
什么是 JWT?
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准((RFC7519).该 token 被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。 JWT 的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该 token 也可直接被用于认证,也可被加密。
Cookie 和 Session 模式的问题
- Session: 每个用户经过我们的应用认证之后,我们的应用都要在服务端做一次记录,以方便用户下次请求的鉴别,通常而言 session 都是保存在内存中,而随着认证用户的增多,服务端的开销会明显增大。
- 扩展性: 用户认证之后,服务端做认证记录,如果认证的记录被保存在内存中的话,这意味着用户下次请求还必须要请求在这台服务器上,这样才能拿到授权的资源,这样在分布式的应用上,相应的限制了负载均衡器的能力。这也意味着限制了应用的扩展能力。
- CSRF: 因为是基于 cookie 来进行用户识别的, cookie 如果被截获,用户就会很容易受到跨站请求伪造的攻击。
基于 Token 的认证模式
基于 Token 的认证流程大致上是这样的:
- 用户使用用户名密码来请求服务器
- 服务器进行验证用户的信息
- 服务器通过验证发送给用户一个 token
- 客户端存储 token,并在每次请求时附送上这个 token 值
- 服务端验证 token 值,并返回数据
JWT 介绍
JWT 由三部分组成: HEADER PAYLOAD SIGNATURE
第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature).
JWT 优缺点
无状态和可扩展性
:Tokens 存储在客户端。完全无状态,可扩展。我们的负载均衡器可以将用户传递到任意服务器,因为在任何地方都没有状态或会话信息。
安全
: Token 不是 Cookie。(The token, not a cookie.)每次请求的时候 Token 都会被发送。
无法作废已颁布的令牌
。所有的认证信息都在 JWT 中,由于在服务端没有状态,即使你知道了某个 JWT 被盗取了,你也没有办法将其作废。在 JWT 过期之前(你绝对应该设置过期时间),你无能为力
2.用户校验中间件
const (
ContextUserIDKey = "userID"
)
var (
ErrorUserNotLogin = errors.New("当前用户未登录")
)
// JWTAuthMiddleware 基于JWT的认证中间件
func JWTAuthMiddleware() func(c *gin.Context) {
return func(c *gin.Context) {
// 客户端携带Token有三种⽅方式 1.放在请求头 2.放在请求体 3.放在URI
// 这里假设Token放在Header的中
// 这里的具体实现方式要依据你的实际业务情况决定
authHeader := c.Request.Header.Get("Auth")
if authHeader == "" {
ResponseErrorWithMsg(c, CodeInvalidToken, "请求头缺少Auth Token")
c.Abort()
return
}
mc, err := utils.ParseToken(authHeader)
if err != nil {
ResponseError(c, CodeInvalidToken)
c.Abort()
return
}
// 将当前请求的username信息保存到请求的上下⽂文c上
c.Set(ContextUserIDKey, mc.UserID)
c.Next() // 后续的处理理函数可以⽤用过c.Get("userID")来获取当前请求的⽤用户信息
}
}
func GetCurrentUserID(c *gin.Context) (userID uint64, err error) {
_userID, ok := c.Get(ContextUserIDKey)
if !ok {
err = ErrorUserNotLogin
return
}
userID, ok = _userID.(uint64)
if !ok {
err = ErrorUserNotLogin
return
}
return
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于