什么是身份验证和授权?
-
身份验证:验证用户或系统身份的过程。它确保请求访问的实体是他们声称的身份。常见方法包括密码、生物识别和令牌。
-
授权:确定允许经过身份验证的用户或系统执行哪些作的过程。它定义授予经过身份验证的实体的权限和访问级别,例如读取、写入或删除资源。
身份验证策略
基本身份验证
- 最简单的身份验证形式,其中客户端在 Authorization Basic 标头中发送 Base64 编码的字符串,该字符串由用户凭据组成。
- 例如,这是使用的格式,然后对其进行编码并将其附加到标头中。
<email>:<password>
- 例如:
田 | 价值 |
---|---|
凭据 | example@example.com:1234 |
Base64 编码 | ZXhhbXBsZUBleGFtcGxlLmNvbToxMjM0 |
页眉 | 授权:基本 ZXhhbXBsZUBleGFtcGxlLmNvbToxMjM0 |
- 然后,服务器接收请求,解码字符串,将它们与数据库值进行匹配并提供响应。
- 优点: 使用简单,可用于不需要高级别安全性的服务。
- 缺点: 不提供广泛的安全性,编码的字符串可以很容易地解密。
JWT 身份验证
- JWT 或 JSON Web 令牌是基于令牌的策略,允许各方使用 JSON 对象在彼此之间安全地传输信息。
-
JWT 以编码格式传输,该格式包含 3 个部分:
-
页眉
- Header 包含有关使用的加密算法和令牌类型的信息。
- 例如:
{
"alg": "HS256",
"typ": "JWT"
}
- 有效载荷
- 一个 JSON 对象,其中包含各方希望在彼此之间发送的信息。也称为 Claims。
- 有一些标准字段,如 “iat” (issued at)、“exp” (expire at) 等,这些字段是 JWT 验证所必需的,可确保安全性,但取决于您的用例。
- 例如:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true,
"iat": 1516239022
}
- 签名
- 它是在将加密算法与标头、有效负载和密钥结合使用后生成的加密字符串。
- 密钥是只有服务器知道的私钥,用于对令牌进行签名并确保其完整性。
- 签名可确保令牌未被更改。如果 Token 的任何部分发生更改,则签名将不再匹配,并且 Token 将被视为无效。
- 例如。的签名中使用算法:
SHA 256
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
- 例如。的 JWT 中:
<Base64Url-encoded header>.<Base64Url-encoded payload>.<Base64Url-encoded signature>
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMn0.KMUFsIDTnFmyG3nMiGM6H9FNFUROf3wh7SmqJp-QV30
- JWT 的验证和确认:
- 验证包括检查令牌的签名,以确保它由服务器生成且未被篡改。
- 验证涉及检查令牌的声明(如过期时间),以确保令牌仍然有效。
- JWT 身份验证流程如何运作?
- 访问令牌:
- 访问令牌是用于访问受保护资源的短期令牌。它是在用户认证成功后由认证服务器颁发的。
- 访问令牌包含在对服务器的 HTTP 请求的 Authorization 标头中。
- 访问令牌的生命周期有限,并在一段时间后过期,需要用户获取新令牌。
- 刷新令牌:
- 刷新令牌是一种长期令牌,用于获取新的访问令牌,而无需用户重新进行身份验证。
- 刷新令牌与访问令牌一起颁发,并且很可能安全地存储在客户端的仅限 HTTP 安全 Cookie 中。
- 当访问令牌过期时,客户端可以使用刷新令牌向身份验证服务器请求新的访问令牌。
- 刷新令牌也有过期时间,但通常比访问令牌的过期时间长得多。
- 大多数身份验证系统将刷新令牌存储在数据库中,以提供额外的安全性并在被盗时撤销功能。
- JWT 身份验证流程:
- 客户端将包含用户凭证的登录请求发送到身份验证服务器。
- 服务器验证凭据,如果有效,则颁发访问令牌和刷新令牌。
- 客户端安全地存储令牌,并将访问令牌包含在访问受保护资源的后续请求的 Authorization 标头中。
- 当访问令牌过期时,客户端使用刷新令牌向服务器请求新的访问令牌。
- 服务器验证刷新令牌,如果有效,则颁发新的访问令牌。
- 客户端继续使用新的访问令牌访问受保护的资源。
- 访问令牌:
- 优点:
- 无状态:JWT 是独立的,不需要服务器端存储,因此非常适合分布式系统。
- 可扩展性:由于 JWT 是无状态的,因此它们可以轻松地跨多个服务器扩展,而无需会话同步。
- 灵活性:JWT 可以携带自定义声明,从而允许灵活且可扩展的身份验证机制。
- 缺点:
- 令牌大小:JWT 可能会变得很大,尤其是在携带许多声明时,这可能会影响性能。
- 安全性:如果保护不当,JWT 可能容易受到令牌盗窃或篡改等攻击。
- JWT 身份验证的实际实现 : https://github.com/the-arcade-01/golang-jwt-authentication
Golang
OAuth 2.0 授权
- OAuth 2.0 (Open Authorization) 是一种授权策略,它允许第三方应用程序在不暴露用户凭证的情况下访问用户资源。
- 示例:假设在我们的应用程序中,我们想访问存储在 Google Drive 中的用户照片。在这种情况下,我们的应用程序需要代表用户访问这些照片。为此,我们使用 Google Auth provider 实现了一种机制,在该机制中,我们向用户指定我们只需要访问照片的权限。用户授予我们权限后,我们将:
- 要求 Google Auth 提供商生成访问令牌。
- 使用访问令牌访问 Google 照片。
使用此流程,我们不需要用户共享其 Google 凭据,也不需要管理任何其他信息。我们的应用程序只需要并与Google身份验证提供商进行通信。client_id
client_secret
-
一个简单的 OAuth 2.0 流程可能如下所示:
-
优点:
- 安全性:OAuth 2.0 允许用户在不共享其凭据的情况下授予对其资源的有限访问权限,从而降低凭据被盗的风险。
- 精细权限:OAuth 2.0 支持精细访问控制,允许用户指定要授予第三方应用程序的确切权限。
- 用户体验:OAuth 2.0 允许用户使用其现有帐户向受信任的提供商进行身份验证,从而提供无缝的用户体验。
-
缺点:
- 复杂性:由于涉及各种流程和安全注意事项,实施 OAuth 2.0 可能很复杂。
- 令牌管理:安全地管理访问和刷新令牌需要谨慎处理,以防止令牌被盗和滥用。
- 对第三方提供商的依赖性:依赖第三方身份验证提供商可能会引入依赖关系和潜在的故障点。
-
在& :
https://github.com/the-arcade-01/react-golang-oauth-flowGolang
React.js
基于会话的身份验证
- 在基于会话的身份验证中,唯一 ID(称为“会话 ID”)在服务器上生成,并在用户成功登录后存储到数据库中。然后,此标识符将发送回给用户,并存储在客户端的 Cookie 中。
- 基于会话的身份验证流程如何运作?
- 用户使用其有效凭证执行登录。
- 服务器验证这些凭证,然后生成一个唯一的 ID,将其存储到某个数据库(例如:Redis)中,并带有过期时间(TTL,生存时间),然后将其发送回给用户。
- 然后,客户端将该会话 ID 存储在 Cookie 中,并使用该 ID 调用后续请求。
- 当服务器收到带有会话 ID 的请求时,它会从数据库中获取会话 ID,检查它是否没有过期,然后将其与请求 ID 进行比较,如果有效则继续,否则不继续。
- 当用户注销时,会话 ID 将被删除。此外,系统还对 Session ID 使用过期时间,以便它们会自动从数据库中删除。
-
优点:更易于实现,提供过期控制(使用 redis 然后自动过期),会话 ID 存储在安全的数据库中。
-
缺点: 适用于整体式应用程序,对于微服务,它需要集中存储和服务,因此系统是一致的,例如对所有入口点使用 API Gateway 并执行身份验证检查。
发表评论 取消回复