什么是身份验证和授权?

  • 身份验证:验证用户或系统身份的过程。它确保请求访问的实体是他们声称的身份。常见方法包括密码、生物识别和令牌。

  • 授权:确定允许经过身份验证的用户或系统执行哪些作的过程。它定义授予经过身份验证的实体的权限和访问级别,例如读取、写入或删除资源。

身份验证策略

基本身份验证

  • 最简单的身份验证形式,其中客户端在 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 身份验证流程
      1. 客户端将包含用户凭证的登录请求发送到身份验证服务器。
      2. 服务器验证凭据,如果有效,则颁发访问令牌和刷新令牌。
      3. 客户端安全地存储令牌,并将访问令牌包含在访问受保护资源的后续请求的 Authorization 标头中。
      4. 当访问令牌过期时,客户端使用刷新令牌向服务器请求新的访问令牌。
      5. 服务器验证刷新令牌,如果有效,则颁发新的访问令牌。
      6. 客户端继续使用新的访问令牌访问受保护的资源。JWT 身份验证流程
  • 优点
    • 无状态:JWT 是独立的,不需要服务器端存储,因此非常适合分布式系统。
    • 可扩展性:由于 JWT 是无状态的,因此它们可以轻松地跨多个服务器扩展,而无需会话同步。
    • 灵活性:JWT 可以携带自定义声明,从而允许灵活且可扩展的身份验证机制。
  • 缺点
    • 令牌大小:JWT 可能会变得很大,尤其是在携带许多声明时,这可能会影响性能。
    • 安全性:如果保护不当,JWT 可能容易受到令牌盗窃或篡改等攻击。
  • JWT 身份验证的实际实现 : https://github.com/the-arcade-01/golang-jwt-authenticationGolang

OAuth 2.0 授权

  • OAuth 2.0 (Open Authorization) 是一种授权策略,它允许第三方应用程序在不暴露用户凭证的情况下访问用户资源。
  • 示例:假设在我们的应用程序中,我们想访问存储在 Google Drive 中的用户照片。在这种情况下,我们的应用程序需要代表用户访问这些照片。为此,我们使用 Google Auth provider 实现了一种机制,在该机制中,我们向用户指定我们只需要访问照片的权限。用户授予我们权限后,我们将:
  1. 要求 Google Auth 提供商生成访问令牌
  2. 使用访问令牌访问 Google 照片

使用此流程,我们不需要用户共享其 Google 凭据,也不需要管理任何其他信息。我们的应用程序只需要并与Google身份验证提供商进行通信。client_idclient_secret

  • 一个简单的 OAuth 2.0 流程可能如下所示:
    OAuth2.0 流程

  • 优点

    • 安全性OAuth 2.0 允许用户在不共享其凭据的情况下授予对其资源的有限访问权限,从而降低凭据被盗的风险。
    • 精细权限OAuth 2.0 支持精细访问控制,允许用户指定要授予第三方应用程序的确切权限。
    • 用户体验OAuth 2.0 允许用户使用其现有帐户向受信任的提供商进行身份验证,从而提供无缝的用户体验。
  • 缺点

    • 复杂性:由于涉及各种流程和安全注意事项,实施 OAuth 2.0 可能很复杂。
    • 令牌管理:安全地管理访问和刷新令牌需要谨慎处理,以防止令牌被盗和滥用。
    • 对第三方提供商的依赖性:依赖第三方身份验证提供商可能会引入依赖关系和潜在的故障点。
  • 在& :
    https://github.com/the-arcade-01/react-golang-oauth-flowGolangReact.js

基于会话的身份验证

  • 在基于会话的身份验证中,唯一 ID(称为“会话 ID”)在服务器上生成,并在用户成功登录后存储到数据库中。然后,此标识符将发送回给用户,并存储在客户端的 Cookie 中。
  • 基于会话的身份验证流程如何运作?
  1. 用户使用其有效凭证执行登录。
  2. 服务器验证这些凭证,然后生成一个唯一的 ID,将其存储到某个数据库(例如:Redis)中,并带有过期时间(TTL,生存时间),然后将其发送回给用户。
  3. 然后,客户端将该会话 ID 存储在 Cookie 中,并使用该 ID 调用后续请求。
  4. 当服务器收到带有会话 ID 的请求时,它会从数据库中获取会话 ID,检查它是否没有过期,然后将其与请求 ID 进行比较,如果有效则继续,否则不继续。
  5. 当用户注销时,会话 ID 将被删除。此外,系统还对 Session ID 使用过期时间,以便它们会自动从数据库中删除。

会话身份验证流程

  • 优点:更易于实现,提供过期控制(使用 redis 然后自动过期),会话 ID 存储在安全的数据库中。

  • 缺点: 适用于整体式应用程序,对于微服务,它需要集中存储和服务,因此系统是一致的,例如对所有入口点使用 API Gateway 并执行身份验证检查。

 

出处:https://dev.to/

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
意见
建议
发表
评论
返回
顶部