Skip to main content

鉴权

认证流程

认证采用双token机制,access_token用于每次调用的鉴权,refresh_token用于续期

  • 除登录接口外的接口,若无特殊规定,均通过token保护
  • 在需要认证的请求中设置metadata "authorization": "Bearer" + " " + <token>
  • 客户端可以持久化储存token,但不应尝试解析token
  1. 客户端通过GetToken接口(即登录接口)获取access_tokenrefresh_tokenaccess_token的有效期大约为几个小时,refresh_token的有效期大约为几天,客户端不需要关心准确的过期时间
  2. 客户端使用access_token访问其他接口
  3. 若服务端因access_token过期拒绝访问接口,则客户端通过RefreshToken接口获取新的access_tokenrefresh_tokenRefreshToken接口需要设置用于认证的metadata,也需要将refresh_token作为参数传入
  4. 若服务端因refresh_token过期拒绝给出新token,则客户端回到第一步。若成功获取到新token,则客户端回到第二步
  • 提前调用RefreshToken接口不会使旧的access_token立即失效,但更旧的access_token可能立即失效(根据服务端的安全策略而定)

JWT

JWT是一个token生成规范,是通过将一个包含数字签名的明文json序列化生成的,服务端依靠数字签名保证其不可伪造。服务端所有种类的token都通过jwt生成,遵循以下要求

  • jwt是明文,所以不应包含敏感信息
  • access_token 不需要在服务端存储,token中需要设置字段以使服务端能够识别用户和token有效期
  • refresh_token 需要在服务端存储,使用时以服务端存储的数据为准,token中只需要设置必要的字段
  • 由于jwt中的json没有字段规范,客户端的任何功能都不应依赖于解析jwt中的字段

安全性

暴力破解

  • 登录接口需要通过必要的手段防止暴力破解,由于系统设计是私人使用,可以选择封禁ip等较激进的措施
  • 其他需要token的接口,由于只需要通过计算验证签名即可验证token的有效性,不需要访问存储服务,所以可以有效地保护

中间人攻击

  • 强制使用tls加密连接,可以避免大多数的攻击
  • access_token 由于每次传输都会携带,所以最有可能泄露,但其有效期短,且不能用于生成新token,造成的影响有限
  • refresh_token 由于是在服务端存储,仅能使用一次,若泄露后到用户刷新token这段时间内没有被使用,则token失效;若被使用了,则用户能够从服务端得知可能存在泄露

客户端泄露

无法解决