用户登录接口的设计,简单的功能不简单 [干货!原创文章禁止转载!

2020-05-09  本文已影响0人  码厨

实践

这里提供一个解决思路,可以适用于一些场景,需要按照具体场景进行适配。还有一个备选的方案,在 https 上做一层类似https的协议,https比较安全的原因很大一部分是证书有效性的验证依赖于操作系统,但是如果没有的操作系统的验证,如果单纯的类似https的协议,收益不大,所以这个实践中就融入了业务的流程。

服务端信息存储的设计

请求签名的设计

这里使用Hmac的思路进行请求签名的方式。Hash( Raw + Salt ),可以看到如果按照这个思路中,前端需要保存Salt,并且后端需要持有相同的Salt,这里因为 原始的明文需要传输所以Salt尽可能不在相同的渠道进行传输,或者不传输。

技术选型:

这里使用JWT组件来做签名组件,Algorithm采用Hash256,需要加入过期时间字段。这个组件在多个平台都有成熟的实现。组件中的 Secret 可以类比成salt,基本原理和Hmac类似。这里为了防止整个请求参数被篡改,那么签名中需要有请求参数的hash值,所以在这个思路中,需要有一个比较合适的通用请求方式,所以最好是Post请求,并且所有的请求参数都放到请求体中,这样会更加便利于这个思路的实现。

signature = JWT(payload={
    "digest": hash256(RequestBody),
    "otherFields": "otherFieldsValues",
    "exp": expireTime
}, key=secretKey, algorithm='HS256')

SecretKey 的设计

现在来看可以看到,SecretKey 的安全性,成了关键,这里使用办法是将用户输入值作为SecretKey相关的生成方式。这里可以适配两个比较普遍的场景,密码登录,验证码登录。

这里主要的思路在登录过程中将用户的输入在前端计算出和注册流程中一样的值,然后将对称的值当做SecretKey使用,这样在登录流程中SecretKey就会这个值就不会出现在传输中并且一边密码的强度又比较高,所以登录过程相对会比较安全。

注册流程中, 由上述流程中可以看出如果可以在可以通过别的渠道获取到和后端一样的对称密钥,那么整个流程会安全很多,这里提供一个方式采用验证的URL的方式,这里需要注意的是密钥需要是用URL hash的方式存放到URL上,用户在注册验证的时候,点开URL,默认情况下浏览器是不会发送Url Hash # 后的部分的,只有客户端可以获取到。

流程参考:

注册流程

登录流程

如有问题欢迎留言或者私信

上一篇 下一篇

猜你喜欢

热点阅读