Logo
Section 1 / 7

授权与认证

让我们来了解一下授权与认证的区别,以及如何安全地发送数据。

导入

授权与认证

让我们来了解一下授权与认证的区别,以及如何安全地发送数据。

用户身份验证和用户授权是大多数Web应用程序中最基本的构建模块。互联网上的大多数网站通过身份验证来识别用户,然后提供用户被授权访问的资源。

身份验证

身份验证 是网站或应用程序验证用户身份的过程。典型的例子就是大多数Web应用和网站中常见的登录和注册功能。例如,我们无法在没有使用有效账户登录的情况下访问课程。

授权

授权 是网站或应用程序验证用户是否有权限访问特定资源的过程。例如,网站管理员可以访问网站的所有资源,而普通用户只能查看网站内容。

授权结合了身份验证的概念。它允许我们识别用户,但并非所有人都能访问所有内容。授权的作用在于为应用中的每种用户类型分配相应的权限。

例如,我们以学习者的身份注册了本课程,因此可以访问课程资源、记录课程笔记并完成练习题。但我们无法编辑课程内容。这是为什么?因为我们作为学习者没有这项权限!只有作者才能编辑内容。

为什么要进行身份验证和授权?

以下是进行身份验证和授权的一些原因:

  • 比基于会话的技术更安全。
  • 不仅在 Node.js 社区中广为人知,也被 Facebook、Google 等大型公司广泛使用。
  • 适用于大规模的应用程序。
  • 实现简单,可用于识别和授权用户。

如何实现身份验证和授权

身份验证和授权是抽象的概念,可以通过多种方法实现,以保护我们的应用程序。在Web开发中,最流行的实现方式之一是 JSON Web Token(JWT)。

JSON Web Token

JSON Web Token(JWT)是一种经过编码且安全的字符串,可以在通过 HTTPS 协议连接的两个设备之间安全传输。有关 JWT 的更多信息可参考 RFC 7519。

让我们假设一个典型的日常场景:用户希望登录账户。他们输入凭据,通常是邮箱或用户名加上密码。如果凭据正确,服务器将生成一个全新的、唯一的字符串,称为 JWT 令牌。随后,服务器将该令牌返回给用户。

这个令牌可以在客户端保存一段时间。当用户需要访问或请求某些数据时,客户端会在请求头中发送该令牌,以便服务器能够识别客户端,并判断其是否有权访问或请求该资源。最常见的应用场景包括注册和登录流程,这些在大多数Web应用中都存在。

用户注册与登录流程

下图展示了用户在访问所需数据之前,预期的注册或登录流程:

如图所示,注册新账户后,用户即可进入应用。我们可以使用用户名或邮箱以及密码进行登录。之后,我们可以请求所需资源,服务器将根据我们的令牌决定是否允许我们访问这些资源。

令牌具有过期时间,可以是几秒、几分钟、几小时等。那么问题来了:如果令牌已过期但仍然有效怎么办?这时,刷新令牌(refresh token)可以解决这个问题——它允许用户在不重新登录的情况下获取新的令牌。关于刷新令牌的概念,我们将在后续课程中详细讨论。目前只需了解刷新令牌如何融入注册和登录流程即可。

注意:在本章中,我们的输出将保持不变,因为我们的重点是实现后端的身份验证与授权。

服务器端

用户模型