这篇文章其实是一道面试题,我会针对登录这个话题做一些讨论。通过这道面试题,可以发现相应功能的共同设计思路、表达能力、容易混淆的概念、功能职责分离以及网络协议的一些特点。您无法在Internet上找到答案。我只有在和面试官交流的时候才会问这样的问题。这个问题会涉及到以下几个方面用户状态保存逻辑/常见的软件应用开发中如何存储和维护用户状态?更多应聘者会提到Token,那么Token服务端的设计策略是什么,接下来进一步细化为服务端如何识别用户,返回正题时如何了解状态。前后端分离大多使用HTTP协议进行通信,但HTTP是无状态的。而我们还要保存用户的状态,这是矛盾的。HTTP是无状态的,只是简单的响应请求,但是业务必须是有状态的,否则业务无法流通和推广。两者有什么关系?账户体系是如何设计的?这样的沟通之后是不是出现了一系列的问题?理解状态对状态的理解其实是很抽象的。我们可以理解为状态就是业务的连续性。有了状态,业务才能正常流动。Flow其实就是数据的流动,state就是在处理数据。无状态的理解核心——独立性,【每个请求都是独立的,低耦合的】。事实上,状态最终是由数据来体现的,有状态就意味着对数据的依赖太大了。界面设计最佳实践文章有以下建议:RESTfulAPI应该是无状态的,这意味着请求身份验证不应依赖于cookie或会话。相反,每个请求都应该带有某种身份验证凭据。现在业界最流行的状态保存维护方案是Token机制。从cookies和session到Token是技术的演进。想想客户端(具体是Android和iOS的nativeclient)中cookies和session的概念?如何理解和解释账户系统设计的第一点登录和注销既然标题中提到了注销功能,那我们就来说说账户系统的设计。之前的产品同事在需求评审中提出了一个场景:公众号链接到业务系统登录,用户在业务系统修改密码后返回微信公众号,仍然可以进入需要的页面登录授权访问,无任何重新登录提示。其实原因很简单。微信公众号链接业务系统登录系统采用两方OAuth协议使用Token存储用户信息(注意这是业务系统本身的登录逻辑,不是微信开发平台)。Token有一个有效的生命周期。考虑到减少用户频繁登录的用户体验效果,微信上的Token有效期会设置的长一些,比如1个月。当用户在有效期内修改密码时,微信端的Token实际上是不可见的。为什么我感知不到?从产品完整性来看,这部分是欠缺的。从技术角度来说,是从Token的生成和存储开始的。Token生命周期由客户端登录场景发起,服务端负责分配和管理。最常见的存储方式是在redis数据库中使用key-value的形式,key是一个token,value是一些需要缓存的热点数据,一般是基于用户ID、用户名等个人资料信息。如果账号系统设计到这里,已经可以满足大部分应用系统以云端为中心,多客户端正常登录的情况。这种认证方式也是我上面提到的广泛的两方OAuth协议的一种应用。上一篇文章单独讲解了两方OAuth系统的服务搭建-两方OAuth然后继续描述,端应用持有用户的Token信息,会对应的找到缓存的数据。修改密码后,系统获得一个唯一标识,如用户号。如果生成token时用户的唯一标识与token不存在对应关系,则修改密码后将无法关联用户的有效token信息。两个对应关系都是以Token为key,以用户的唯一ID为key。结合使用,可以实现Token管理账户体系设计。远程管理系统的第二点是将接入账户系统的系统抽象成一个应用程序。无论是网站、原生应用、混合应用,还是微信小程序。远程管理用户分为两种,一种是云管理员,一种是登录用户。云管理员可以远程查看用户登录状态、在线统计、多设备管理、踢人等,都是这方面的应用场景。已登录用户可在个人中心查看个人账号登录了哪些应用,剩余时间还有多少,并可退出已登录应用。如图2Teambition的个人中心。以上是开放平台授权登录的套路,只涉及到应用服务器和客户端,没有达到OAuth三方角色的复杂度。远程开户、维护、注销、统计账户系统设计第三点服务化设计是基于以上两点。设计完成后,账户系统满足了独立于其他系统的要求,可以作为账户中心运行。它本身就是通行证的协调配送中心。我们尝试列举如下FetureList实名验证1.手机验证通过发送验证码验证登录身份2.多种登录方式,如手机验证码、用户名密码、微信扫码(第三种)-partyaccount),mobilephoneApplicationauthorizationmanagementwithpassword(一种用户名登录)应用授权管理企业应用分为内部应用和外部应用应用列表退出应用登录应用退出所有应用操作日志密码修改、找回、登录方法选择1修改密码后的登录管理(单点登录、设备关联、退出已有登录)2有效登录时长(终端应用自身控制)退出功能和网络支持回到正题,退出功能的乘积形式网络支持如下:注销函数请求注销接口,server注销登录凭据,客户端删除相关的本地存储。有没有网络,退出接口成功与否,以成功的退出交互引导用户,其他的都是通过技术实现的。比如服务器自动失效等。一个常见的误解是注销只是删除客户端的凭据,然后跳转到登录页面。这个过程太简单了。2019年12月结束公众号屠南日升
