当前位置: 首页 > 科技观察

登录工程:现代Web应用的典型认证需求

时间:2023-03-18 01:08:38 科技观察

我的朋友在一家大型互联网公司工作。前不久在聊天室问他日常工作,他说他的部门只负责一件事,就是用户和登录。他的具体工作是为每个业务子站点提供友好的登录小部件(Widgets),从而统一整个站点组的登录体验,同时也省去业务开发人员在用户认证上花费额外的精力。这真有趣。可以看出,在一个现代的web应用中,围绕着“登录”的需求,衍生出了一个新的项目。无论是我们面临的需求,还是解决这些需求所使用的方法和工具,都已经超出了传统Web应用认证技术的范畴。在上一篇文章中,我谈到了传统Web应用程序中的身份验证技术。文章中列举的一些方法,为长期以来满足大量Web应用中的认证需求提供了思路。在本文中,我将简要介绍现代Web应用程序中几种典型的身份验证需求。多种形式的身份验证考虑这样一个场景:我们在电脑上登录微软账户,电脑中的“Mail”应用程序可以自动同步邮件;我们登录网页版的Outlook电子邮件服务,如果在电子邮件中发现了重要的工作安排它,将其添加到您的日历中,很快您计算机的“日历”应用程序就可以在您的Windows桌面上显示这些事件。此场景包括多个身份验证过程。至少涉及Web版Outlook服务的认证,还涉及离线版邮件应用的认证。为了能够支持同一组用户同时在浏览器和移动端或本地应用程序(例如WindowsUWP应用程序)中登录,有必要开发一个可以服务于这两种应用程序的认证系统。在浏览器中,我们通常假设用户不信任浏览器,用户通过与服务器建立的临时浏览器会话来完成操作。会话开始时,用户将被重定向到特定页面以进行登录。登录完成后,用户通过继续与服务器交互来延续临时会话;一旦用户一段时间不与服务器交互,他的session很快就会过期(被服务器强行注销)。在移动应用程序中,情况有所不同。相对而言,安装在移动设备上的应用更受用户信任,移动设备的安全性也优于浏览器。另一方面,将用户重定向到网页登录并不能提供良好的用户体验——更重要的是,当用户使用移动设备时,他们的时间是碎片化的。我们不能要求用户在特定时间内完成操作,所以基本上没有session的概念:我们需要想办法将用户凭证安全的、相对持久的存储在设备中,web应用服务器可能需要配合用这个方法完成认证。此外,移动设备也不是绝对安全的,一旦设备丢失,会给用户带来安全隐患。因此,需要在服务器端提供一种机制来取消登录设备的访问权限。(图片来自:http://docs.identityserver.io/en/release/intro/big_picture.html)多种方便用户的登录方式“输入用户名和密码”作为标准登录凭证广泛应用于各种登录场景.然而,在网络应用,尤其是互联网应用中,网站经营者越来越发现,使用用户名作为用户标识确实为网站提供了便利,但对用户的帮助却没有那么大:用户很可能会忘记自己的用户名。用户在使用不同网站的过程中,为了不忘记用户名,不得不使用相同的用户名。如果碰巧遇到某个网站用户名被盗用的情况,他就得临时为这个网站拟定一个新的用户名,所以这个新用户名很快就被遗忘了。越来越多的网站在注册时要求用户提供邮箱地址或手机号码,部分网站还支持用户通过多种方式登录。例如,提供一种功能,允许用户在使用一种方法注册后绑定其他登录方法。绑定完成后,用户可以选择自己喜欢的登录方式。隐含着网站与用户之间的共识:联系方式的所有者是用户本人,这种“从属”关系可以用来验证用户的身份。当用户下次注册新网站时遇到“邮箱地址已注册”或“手机号码已注册”时,基本可以确认自己已经在该网站注册。(图片来自:http://cargocollective.com/)此外,登录过程中支持的联系方式也多种多样。电子邮件服务在很多场景中逐渐被其他各种联系方式(如手机、微信等)所取代。许多人根本没有使用电子邮件的习惯。如果网站只提供邮箱注册,有时会被攻击。来自不经常使用电子邮件的用户的不满。因此,支持多种登录方式成为很多网站的迫切需求。双因素认证:上一节增强登录流程中提到的“从属”关系,不仅可以帮助用户判断自己是否在网站注册过,还可以帮助网站在忘记密码时进行临时认证,从而帮助用户完成新密码设置。如果在正常登录过程中使用此关联进行进一步验证,则构成双因素身份验证。双因素身份验证要求用户在登录过程中提供两种不同形式的凭据,只有两种身份验证都成功才能继续操作。现代Web应用程序越来越多地使用这种增强的身份验证方法来保护关键操作的安全。比如查看和修改个人信息,修改登录密码等。相信很多人还记得QQ密码保护问题的机制,这使得黑客即使盗取QQ密码也无法修改现有密码了解密码保护问题,以便账户所有者及时挽回损失。双因素的原则是:两种验证因素的性质不一致,冒用身份的用户同时获取用户的两种信息的概率很低,这样账户的安全性就可以得到有效保护。在QQ密码保护的例子中,密码是每次登录都会用到的固定文本,比较容易被盗;而密码保护问题不经常设置和更改,保密性强,个人化程度高,不容易被盗。(图片来自:http://bit.ly/2kFc492)现代Web应用形式多样,设备种类繁多,场景复杂多变,为了更好的保护用户账号的安全,很多应用开始使用双因素身份验证作为登录过程中的身份验证步骤。为了兼顾安全性和便利性,一些应用还需要一些优化策略来提升用户体验。例如,只有当用户在新设备上登录时才需要双因素认证,一段时间未登录后再次登录,在不经常登录的地方登录,更改联系方式和密码,转移账户资产,等关键操作。单点登录:还是需要精心设计。以往,一般只有在大型网站向用户提供多种服务时(如网易运营网易门户、网易邮箱等服务),才会迫切需要单点登录。但在现代Web系统中,无论是从业务的多元化还是架构的服务化考虑,服务的划分都更加细化。从整个企业的业务模型(比如网易门户、网易邮箱),到某个业务的具体流程(比如京东下单、京东支付),再到某个流程的具体步骤(比如短信验证、支付扣费),“服务”的概念越来越轻量化,人们不得不创造“微服务”这个新的范畴词汇来拓展认知空间。(图片来自:http://cargocollective.com/)在整个演进过程中,由于安全的需要,身份验证的需求一直存在,而且粒度越来越细。过去我们更注重用户在多个子站点的统一登录体验,现在我们也需要关注用户在多个子流程、多步骤的统一登录体验。这些流程和步骤很可能是一个独立的web系统(微服务),或者是一个用户界面(独立应用),或者是一个第三方系统(界面集成)。可以说,单点登录的需求有增无减,但是当开发者已经习惯了这种模式时,他们就不再意识到这也是一个可以专门讨论的话题。考虑与用户系统集成并与业务系统分离。在讨论安全性时,两个不可分割的部分是身份验证和授权。认证过程是向用户发起挑战(Challenge)以完成认证工作。这正是登录解决的问题。通常,登录系统成功识别用户后,接下来的工作会直接交给业务系统完成。由于各个系统中的授权模型可能与业务表单相关,所以将登录与业务系统分离是很自然的设计。在安全要求比较严格的企业或企业应用中,可能需要一种特殊的访问管理机制,但这种方式在互联网应用中并不多见。但是在InternetWeb应用中,授权的范围还包括一个小的公共部分,这是所有业务系统共有的:即用户身份。我们希望在业务子系统之间共享用户状态:一个用户被锁定后,他在所有业务系统中都被锁定;用户注销后,所有业务系统中关于他的所有数据都将被密封。此外,在多个业务系统中,还可能共享用户的基本信息、偏好设置等数据。例如,电子邮件地址等信息可用作登录凭据或基本联系方式。如果用户在一个子系统中设置了首选语言,其他子系统可以直接使用该设置。就这样,开发“用户”系统的想法应运而生。由于与用户状态等基本信息的关系非常密切,因此登录和用户系统的集成是很自然的,直接将登录子系统作为用户系统的一部分使用也是一种很好的做法。与第三方集成:欢迎更多用户“集点”是一款开放的文档共享应用,其特点是“无需登录,即时访问”。它使用长期有效的cookie来识别用户,从而省去了人们使用之前必须注册和登录的繁琐步骤。这种做法的风险在于,如果用户有及时清除浏览器cookie的习惯,很可能再次登录时,用户将不再被识别。但是,从这么一个小例子,不难看出,login的真正作用是web应用识别用户的过程。当同一用户下次再次使用时,Web应用程序可以知道“这是上次来的用户”。.如果不需要用户注册也能满足识别用户的需求,岂不是两全其美?基于第三方身份提供者的接口来识别在其他平台注册的用户,并将其转化为自己的应用用户,这种方式是完全可行的,大量的开发者已经有了丰富的实践。从2010年开始,许多大型互联网公司开始推出开放平台服务,允许第三方应用通过Web界面与这些互联网服务进行交互,从而为其提供更加丰富多彩的功能。在这个过程中,一些应用并没有为这些平台提供扩展,而是巧妙地利用了这些开放平台的标识接口,避开了新用户注册的过程,从而为自己的产品快速导入用户。很多网站都提供了“微博账号登录”的功能,相信读者一定体验过。(图片来自:http://bit.ly/2kFi3e8)如果你的应用需要向第三方提供用户,那么我们的角色就从“从上下文读取用户身份”变成了“将用户身份写入上下文”。如果你恰好有和各种互联网公司开放平台的接口打交道的经历,这个时候,你就能体会到提供开放安全上下文的挑战。如果……你的平台既要让其他平台的用户能顺利访问,又要让你的用户接触到其他平台,那可能又是一个更有趣的挑战。这个过程也可以作为除生物特征验证之外的另一种间接消除密码的方式。登录现在实际上是一个单独的项目。尤其是在各种形式的基于Web的应用以及这些Web应用本身所依赖的各种后端服务的快速增长过程中,各种认证需求也随之而来。如何在保证每个环节安全的同时,为用户提供良好的体验成为一个挑战。此外,个人信息泄露事件频频曝光,引发的社会问题也开始受到更多关注和关注。作为IT系统的支持者,工程师有责任了解与安全相关的基础知识,掌握必要的技能来处理保护用户数据和企业利益的问题。在下一篇文章中,我将介绍解决典型登录需求的具体技术方案,以及相关领域的安全实践常识。【本文为专栏作者“ThoughtWorks”原创稿件,微信公众号:Thinkworker,转载请联系原作者】点此查看该作者更多好文