注册登录设计
功能点:注册(手机号、邮箱、身份证、社保卡...)、登录(账号登录、手机登录...)、修改密码(通过旧密码验证)、重置密码(通过邮箱验证、通过手机验证)、注销(注销当前登录)、注销(将账号注销,删除账号)、记住账号(免登录)、第三方账号登录注册(微信、QQ、谷歌账号...)
流程设计
账号注册主流程
手机号注册流程:

邮箱注册流程:

手机注册和邮箱注册需要分开处理。
需要着重考虑的点:校验提示处理、密码加解密处理、验证码不能直接返回前端,需要在后端做存储校验、密码强度/邮箱/手机号等校验需要前后端都做。
做短信验证码、邮箱验证码处理时,注意第三方的接口调用限制。提供接口时,做好发送条数限制(某个时间段发送不能超过N条)的处理。
邮箱/短信发送信息,需要提供可配置功能,最好接入2-3个第三方短信/邮箱平台。避免某个平台故障时,影响业务的正常运行。
密码加密需要使用不可逆加密,登录验证时将前端传递的密码进行加密后,与存储的加密密码进行比对。
登录主流程

简单登录(不保存登录状态)
登录时,直接校验登录信息,然后返回登录状态。
缺点:每次访问资源都需要登录

session登录
登录时,将生成的session信息、用户信息存储到cookie信息中返回给前端。后续前端请求时,自动带上cookie信息,通过校验请求里带的session信息、用户信息,判断该用户是否需要重新登录。
注意session、cookie管理。
使用cookie时,注意信息加密,还需要注意使用HttpOnly属性,防止前端篡改信息。
缺点:
1.在集群部署下,不同服务器之间的session信息不共享,需要考虑session同步或者负载均衡配置时将一个用户的请求转发到同一个服务器。
2.session都是保存在内存中,而随着认证用户的增多,服务端的开销会明显增大.
cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。

token登录
1、客户端使用用户名和密码请求登录
2、服务端收到请求,验证用户名和密码
3、验证成功后,服务端会签发一个token,再把这个token返回给客户端
4、客户端收到token后可以把它存储起来,比如放到cookie中
5、客户端每次向服务端请求资源时需要携带服务端签发的token,可以在cookie或者header中携带
6、服务端收到请求,然后去验证客户端请求里面带着的token,如果验证成功,就向客户端返回请求数据
优点:
支持跨域访问:cookie是无法跨域的,而token由于没有用到cookie(前提是将token放到请求头中),所以跨域后不会存在信息丢失问题
无状态:token机制在服务端不需要存储session信息,因为token自身包含了所有登录用户的信息,所以可以减轻服务端压力
更适用CDN:可以通过内容分发网络请求服务端的所有资料
更适用于移动端:当客户端是非浏览器平台时,cookie是不被支持的,此时采用token认证方式会简单很多
无需考虑CSRF:由于不再依赖cookie,所以采用token认证方式不会发生CSRF,所以也就无需考虑CSRF的防御
注:因为token认证是无状态的,只能自动失效,所以像注销操作,无法从后端注销,如果需要从后端完成注销,则需要将token信息进行存储,在注销时对缓存信息进行处理。一般选择存储在redis中,建议使用黑名单方法,即注销后放入黑名单,一段时间后自动过期。这样可以不用每次都往redis里存。
token生成方案建议采用jwt。

修改/忘记密码主流程

注销
注销时,注意相应session信息、token信息的处理。
其他注意点:
流程中校验提示信息最好提前设计好,像注册时提示“账号已存在”、登录时提示“密码错误”/"账号错误",这种信息可能会被用做撞库。