BB认证

249 阅读3分钟

提出问题:认证,服务提供方确认服务请求方的身份,有没有权利调用该服务,一般都涉及N:N前后端通信的过程。如何认证?

http1.0协议问题,是一种无状态的协议,每次双方通信都需要进行验证,服务器端无法识别每个客户端。也就是说http只解决了通信问题,无法解决之后的认证问题。

解决方案1:传统的session认证

  • 传统session方法,通过在客户端登录的服务器存储一份用户登录的信息,并向客户端返回方便下次认证信息cookie,这样该服务器就能识别并认证该客户端。
  • 但随之会产生了三个问题:
    • 多客户端连接服务器,服务器保存session信息在内存中,消耗内存空间
    • 对于分布式服务器,每次客户端登录的服务器机器可能不同,则无法认证,无法扩展服务器数量
    • cookie如果被截获,客户端就会很容易受到跨站请求伪造的攻击。

解决方案2:基于token的鉴权机制

  • 流程如下,可以解决之前session认证的三个问题
    • 1.用户使用用户名密码来请求服务器
    • 2.服务器进行验证用户的信息
    • 3.服务器通过验证发送给用户一个token
    • 4.客户端存储token,并在每次请求时附送上这个token值
    • 5.服务端验证token值,并返回数据 avatar
  • 该如何设计token? token设计的国际标准JSON WEB TOKEN----JWT
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
  • JWT的构成,JWT是由三段信息构成的,将这三段信息文本用.链接一起就构成了Jwt字符串。
    • 第一部分为头部(header)
    • 第二部分为载荷(payload)
    • 第三部分为签名(signature)
  • header,承载两部分信息
    • 声明类型,这里是jwt
    • 声明加密的算法 通常直接使用 HMAC SHA256 然后将头部进行base64加密(该加密是可以对称解密的),构成了第一部分
  • playload,载荷就是存放有效信息的地方
    • 标准中注册的声明
    • 公共的声明
    • 私有的声明 然后将其进行base64加密,得到Jwt的第二部分。
  • signature,签名,防止之前两部分信息被篡改
    • header (base64后的)
    • payload (base64后的)
    • secret(盐,只能服务端知道) 这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。