身份验证和授权101

2025-05-24

身份验证和授权101

替代文本

该博客文章最初发表于 Tes Engineering博客

去年,我在Node GirlsWomen of Security聚会上发表了演讲,分享了我加入Tes 安全工程团队
以来在身份验证和授权方面的一些经验。您可以点击此处 观看本次演讲的视频

这篇文章总结了演讲中提出的一些要点,以及示例应用程序中的一些草图笔记和代码片段。

身份验证和授权都与身份概念相关。虽然这两个词相似,但含义不同。让我们来探讨一下……

验证

从最基本的层面上讲,我们可以说身份验证是检查用户身份的过程:你就是你所说的那个人吗?

替代文本

身份验证最常用于应用程序的登录页面。登录时,系统会根据数据库中存储的信息对用户输入的凭据进行检查。这使我们能够验证用户的身份,例如通过用户名和密码。

虽然身份验证的概念很简单,但其实现的技术过程通常很复杂,因为确保用户数据安全至关重要。因此,许多公司选择使用第三方公司(例如 Google 或 Auth0)来处理身份验证流程。

有些公司选择自行实施身份验证。如果您选择这种方式,以下是一些黄金法则。

规则 1:只有客户才应该知道他们的密码

替代文本

确保机密数据的安全对于任何公司保护用户和声誉都至关重要。我们希望降低这种风险:即使恶意攻击者访问了数据库,他们也永远无法获得纯文本密码。防止这种情况发生的最安全策略是完全不存储纯文本密码。

一种解决方案是对密码进行哈希处理,进行“单向”转换,将纯文本密码转换为无法识别的字符串。我们可以使用单向加密来验证密码,同时让恶意攻击者很难将其转换为原始的纯文本值。

替代文本

我们可以使用维护良好且广受认可的开源库(例如bcrypt 库)来安全地对密码进行哈希处理。以下是使用bcrypt 库在存储密码之前对其进行哈希处理的示例代码片段,以确保用户凭据的安全。

规则 2:使用前务必验证用户输入

替代文本

应用程序最常遭受攻击的地方之一是登录页面。注入或劫持攻击的目的是通过发送指令,让我们的代码执行一些我们未指示的操作,这些指令会指向我们期望获取用户输入的数据或凭证。

永远不要相信用户输入来保护应用程序,而是在使用数据之前始终验证和转换数据。

替代文本

再次,像Joi这样广泛使用的开源验证库可以帮助您轻松创建模式并将数据转换为安全对象。

授权

用户通过身份验证后,我们可以继续检查他们有权访问哪些资源。控制谁可以访问哪些资源对于保护数据、声誉和收入至关重要。

替代文本

我们可以使用角色来指示用户是否有权访问资源。例如,只有管理员才能访问管理页面,或者只有特定的客户端才能访问特定的端点。

JSON Web 令牌(JWT)

Json Web Tokens (JWT)有助于实现授权。JWT
是一个开放标准,它定义了一种以 JSON 对象的形式在各​​方之间安全地传输信息的方法。

我们可以信任这些信息,因为它经过数字签名,并由服务器端代码验证。
它有助于授权系统扩展,确保只有获得授权的人员才能访问特定资源,并保护您的个人数据。

符号

替代文本

JWT 使用只有应用程序知道的密钥或公钥/私钥对进行数字签名。这意味着应用程序可以确保 JWT 是从可信来源(通过该密钥或对应的公钥)签名的,并防止其被秘密篡改。

下面是使用jsonwebtoken 库对 JWT 进行签名并将其添加到 cookie 的示例。

替代文本

角色数据包含在 JWT 中,例如,在本例中,如果用户名是“admin”,则该用户将获得“admin”角色。显然,这种角色管理方式只是玩具项目的一种小技巧,在真正的安全系统中,会有更复杂的管理员管理方法。

核实

替代文本

一旦我们有了 JWT,我们就可以验证令牌在我们的服务器上是否有效,并且只有当 JWT 没有被篡改或过期时才信任它。

替代文本

jsonwebtoken 库允许我们以数字方式验证用户或客户端,并有效地管理他们是否应该有权访问特定资源。

概括

除了了解更多有关身份验证和授权的知识之外,本博客的目的还在于表明,作为工程师,我们可以学习一些良好的安全实践,并可以访问许多开源库来帮助我们构建更安全的应用程序。

编写安全代码对我们的用户来说绝对至关重要 - 您无需成为安全专家即可开始。

如果您想了解更多有关这里涉及的一些主题,我在下面列出了一些我认为有用的文章。

进一步阅读

密码
验证
JSON Web 令牌
曲奇饼
文章来源:https://dev.to/charlottebrf_99/authentication-and-authorization-101-143e
PREV
破解 CSS 中居中对齐文本/图像/元素的方法
NEXT
从初学者进步到中级开发人员