简体中文
  • 身份认证
  • 开发
  • 身份验证
  • 授权

你需要为应用构建自己的身份验证系统吗?

我看到很多开发者提问“我应该为我的应用构建自己的身份验证系统吗?”。虽然答案不能简单地说“是”或“否”,但我想写一篇文章来细述实现过程,并举出优缺点,帮助你做决定。

Gao
Gao
Founder

背景

我见过很多开发者提出诸如“我应该为我的应用构建自己的身份验证系统吗?”这样的问题。虽然答案不能简单地说“是”或“否”,但我想写一篇文章来详述实现过程,并题出优缺点以帮助你做决定。

** 简单总结 ** 除非你真的想要完全控制或者你还在学习软件开发,否则找到一个符合你需求的现有解决方案是必要的。

引言

作为开发者,我在职业生涯中构建了许多应用。无论编程语言如何,我总是需要构建一个共同的基础:用户身份验证。

回溯 20 年前,它是字可忽视的部分,因为一切都简单明了:

  • 使用用户名和密码实现注册和登录系统。
  • 创建一个保持用户会话的机制。
  • 安全问题?MD5 就是答案。

就这样。然后我就可以专心去做“真正的业务”。没有听说过 MD5?你错过了软件开发的“美好时光”。而现在,开发者在构建登录/注册时面临更多挑战。

虽然听起来危言耸听,但让我通过一个例子进行说明。

示例:一个在线书店

假设你正在试图用一个 API 服务和一个 web 前端应用来构建一个在线书店。

首先,应该定义“身份验证”的范围。身份验证可以解释为身份认证和授权,并且它们有完全不同的定义和用例:

我写了一篇文章 CIAM 101: 身份认证,身份,SSO 详细讨论了这些概念。

选择身份认证方法

让我们从“身份认证”开始,这在我们的例子中是用户登录。除了用户名和密码方法,这里有一些人们正在采用的趋势方法,以便更好地进行用户转换和安全性:

  • 密码无关,即动态验证码(通过电子邮件或短信)
  • 社交登录(Google,Facebook等)

方法的选择取决于商业决策,而我们可以看看技术上的努力:

  • 对于无密码,您需要找到供应商通过电子邮件或短信发送验证码;然后将其与您的 API 服务集成(可能需要新的 API)。
  • 对社交登录,您必须遵守您希望使用的社交身份供应商的集成指南。另外,你还必须在你的书店的用户 ID 和身份供应商之间建立一个映射。
    • 例如,当用户使用 Gmail 账号 [email protected] 登录时,您可以将此电子邮件地址与书店的用户 foo 关联。这个过程帮助你构建一个统一的身份系统,并允许用户在未来修改或取消他们的社交身份的链接。

设计和实现登录体验

在你决定了身份认证方法后,为你的最终用户提供优雅流畅的登录体验是下一个目标。这里的转化率对于业务来说基础但至关重要,因为这是留存客户数据的自然方式。

当我在 Airbnb 工作时,有一个整个团队致力于优化多平台的登录体验。他们进行了大量的 A/B 测试,以确定哪种组合有最高的转化率。

在一项业务刚刚启动时,这样做可能不切实际。但我们仍然需要尽我们最大的努力使每一部分都做对。你想在哪些平台上运行书店?你可能会从移动,web 或两者开始。确切的设计将取决于你选择的身份认证方法:

  • 用户名和密码:最简单的一个,只需要几个输入框和按钮。
  • 密码无关:输入电话/电子邮件,然后发送和验证动态代码。
  • 社交登录:阅读您选择的社交身份供应商的文档,遵循视觉指南,处理重定向逻辑,最后将社交身份与书店身份关联。

要使其更好,需要考虑的更多事情:

  • 你需要为特定的方法结合登录和注册的过程吗?
  • 你需要一个“忘记密码”的流程,让客户自己重置密码吗?

如果你选择使用原生开发,额外的一个平台的工作量几乎会增加一倍。

安全和令牌交换

安全可能是一个隐藏的冰山。如果你熟悉 OpenID Connect 或 OAuth 2.0,那就很好,因为它们被广泛使用并且经过了战斗测试。OpenID Connect 相对较新,但是设计用于“用户身份认证”,这对在线书店来说非常合适。

不深入探讨这些标准的细节,仍然有一些需要考虑的事情:

  • 应该使用哪种加密方法对密码进行加密?
  • 标准身份认证和授权的流程是什么?
  • 令牌交换如何工作(访问令牌,刷新令牌,ID 令牌等)?
  • 在令牌中应如何使用签名密钥,以及如何验证签名以保护资源?
  • 如何预防客户端和服务器攻击?

最后,你可以提供一个好的登录体验,将其提供给你的客户。

授权模式

作为一个书店,你需要为客户和卖家分别资源。例如,客户可以浏览所有的书籍,而卖家可以管理他们正在销售的书籍。一开始用简单的 if-else 检查就可以了;但是,随着业务的增长,你可能需要利用一个更灵活的模型,如基于角色的访问控制(RBAC)或基于属性的访问控制(ABAC)。

我也写了一篇文章 CIAM 102: 授权 & 基于角色的访问控制 来演示基本的授权理念和 RBAC 模型。

做决定

你可以看到身份验证不是一个“你要么有,要么没有”的问题,因为它涉及多个技术组件,你或你的团队在这些领域可能有不同的技术专长。把它拆成较小的部分,以获得对现状的更好理解,是很重要的。

为了做决定,我会问自己以下问题:

  • 项目有多紧急?
  • 我期望把多少的精力投入到身份认证与业务中?
  • 用户体验,安全性,和维护性的优先级是什么?
  • 我需要对哪部分有全面的控制?我需要对它们有多大的了解?
  • 如果我使用一些框架 / 解决方案,它们对自定义或扩展是否足够好?
  • 如果业务增长,我是否需要引入新的身份认证模式?
  • 如果我找到一个合适的供应商,它是否足够安全。如果供应商突然发生什么事情,我是否需要一个撤出的计划?

根据以上问题,我发现了两个事实:

  • 制作一个可靠的身份验证系统非常复杂。
  • 现有的供应商无法满足所有必要的条件。

所以我决定启动一个专门的项目(Logto)用于身份验证,并从一开始就拥抱开源社区。

希望这篇文章对你有所帮助。