鉴权
认证流程
认证采用双token机制,access_token
用于每次调用的鉴权,refresh_token
用于续期
- 除登录接口外的接口,若无特殊规定,均通过token保护
- 在需要认证的请求中设置metadata
"authorization": "Bearer" + " " + <token>
- 客户端可以持久化储存token,但不应尝试解析token
- 客户端通过
GetToken
接口(即登录接口)获取access_token
和refresh_token
。access_token
的有效期大约为几个小时,refresh_token
的有效期大约为几天,客户端不需要关心准确的过期时间 - 客户端使用
access_token
访问其他接口 - 若服务端因
access_token
过期拒绝访问接口,则客户端通过RefreshToken
接口获取新的access_token
和refresh_token
,RefreshToken
接口需要设置用于认证的metadata,也需要将refresh_token
作为参数传入 - 若服务端因
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失效;若被使用了,则用户能够从服务端得知可能存在泄露
客户端泄露
无法解决