」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 身份驗證類型:JWT、OAuth 以及與 Google 和 Facebook 的安全性集成

身份驗證類型:JWT、OAuth 以及與 Google 和 Facebook 的安全性集成

發佈於2024-10-31
瀏覽:493

Authentication Types: JWT, OAuth, and Secure Integration with Google and Facebook

在现代 Web 开发领域,身份验证对于确保安全访问您的应用程序至关重要。处理用户身份验证的方法有多种,其中一些最流行的方法包括 JWT (JSON Web Token)OAuth。在这篇文章中,我们将探讨这些方法,并向您展示如何将身份验证与 GoogleFacebook 等流行服务集成,同时保证您的系统安全。

什么是身份验证?

身份验证是验证尝试访问系统的用户身份的过程。当您登录应用程序时,身份验证可确保您的身份是您所说的身份。

认证方式有多种,包括:

  • 基于密码的身份验证:用户提供用户名和密码的最常见方法。
  • 基于Token的认证:用户登录后会收到一个Token,用于验证后续请求。
  • OAuth:允许第三方服务验证用户,提供访问权限而无需共享密码。

什么是 JWT(JSON Web 令牌)?

JSON Web Token (JWT) 是保护 API 和单页应用程序 (SPA) 安全的流行方法。 JWT 是一种紧凑的、URL 安全的令牌,用于在各方之间安全地传输信息。

JWT 的构成如下:

  • 标头:包含有关令牌类型和签名算法的信息(例如,HMAC、RSA)。
  • Payload:包含正在传输的声明或数据(例如,用户 ID、过期时间)。
  • 签名:通过验证数据未被更改来确保令牌的完整性。

JWT 示例

{
  "header": {
    "alg": "HS256",
    "typ": "JWT"
  },
  "payload": {
    "sub": "1234567890",
    "name": "John Doe",
    "iat": 1516239022
  },
  "signature": "SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
}

JWT 是通过使用密钥对标头、有效负载和签名进行编码而创建的。然后,该令牌被发送到客户端(通常存储在本地存储或 cookie 中)并与每个请求一起传递以对用户进行身份验证。

其工作原理如下:

sequenceDiagram
    participant User
    participant Server
    User ->> Server: Sends Login Credentials
    Server ->> User: Sends JWT
    User ->> Server: Requests Data with JWT
    Server ->> User: Verifies Token, Responds with Data

为什么使用智威汤逊?

  1. 无状态:服务器不需要存储任何会话数据。 JWT 包含所有必要的信息。
  2. 可扩展:由于服务器上没有会话存储,因此更容易扩展应用程序。
  3. 安全性:签名确保token未被篡改。

什么是 OAuth?

OAuth 是一个开放的授权标准。它允许用户使用现有帐户(例如 Google、Facebook)登录第三方应用程序,而无需与第三方应用程序共享其凭据。

OAuth 的工作原理是颁发访问令牌,允许第三方服务代表用户与其他平台进行交互。

这是 OAuth 的基本流程:

sequenceDiagram
    participant User
    participant App
    participant Google/Facebook
    User ->> App: Login with Google/Facebook
    App ->> Google/Facebook: Requests Authorization
    Google/Facebook ->> User: User Authorizes Access
    Google/Facebook ->> App: Sends Access Token
    App ->> User: Authenticated!
  1. 用户点击使用 Google 登录使用 Facebook 登录
  2. 应用程序将用户重定向到 Google/Facebook 进行身份验证。
  3. 用户同意允许访问特定信息(例如个人资料、电子邮件)。
  4. Google/Facebook 向应用提供访问令牌
  5. 应用程序使用令牌代表用户发出授权的 API 请求。

为什么使用 OAuth?

  1. 方便:用户无需创建新密码或帐户。
  2. 安全性:用户绝不会直接与您的应用共享他们的凭据。
  3. 标准化:OAuth得到Google、Facebook、Twitter等平台的广泛支持

将 OAuth 与 Google 和 Facebook 集成

要将 OAuth 与 GoogleFacebook 集成,请按照以下步骤操作:

第 1 步:在 Google 或 Facebook 上创建应用程序

  • 对于 Google,请转到 Google 开发者控制台并创建一个项目。
  • 对于 Facebook,请转至 Facebook 开发者门户并设置一个新应用。

第 2 步:获取客户端 ID 和客户端密钥

您将从 Google 或 Facebook 收到 客户端 ID客户端密钥。这些用于识别您的应用程序并对其进行授权。

第 3 步:在您的应用程序中设置 OAuth

下面是使用 Node.js 和 Passport.js 实现 Google 身份验证的示例:

const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20').Strategy;

passport.use(new GoogleStrategy({
    clientID: process.env.GOOGLE_CLIENT_ID,
    clientSecret: process.env.GOOGLE_CLIENT_SECRET,
    callbackURL: '/auth/google/callback'
  },
  function(token, tokenSecret, profile, done) {
    // Save the user info from the profile
    return done(null, profile);
  }
));

// Routes for authentication
app.get('/auth/google', passport.authenticate('google', { scope: ['profile', 'email'] }));

app.get('/auth/google/callback', 
  passport.authenticate('google', { failureRedirect: '/' }),
  function(req, res) {
    // Successful authentication
    res.redirect('/dashboard');
  });

在此示例中:

  1. 用户点击“使用 Google 登录”。
  2. 用户被重定向到 Google 进行身份验证。
  3. 成功登录后,Google 使用访问令牌将用户重定向回您的应用。

确保身份验证安全

实施身份验证时,安全性至关重要。以下是一些保护您的身份验证系统的最佳实践:

1. 使用 HTTPS

始终使用 HTTPS 来加密客户端和服务器之间传输的数据。这可以防止攻击者拦截敏感信息。

2. 实现令牌过期

令牌(尤其是 JWT)应该有一个过期时间,以降低令牌重复使用的风险。例如,您可以将 JWT 设置为在 15 分钟后过期,并使用刷新令牌生成新令牌。

3. 安全存储代币

对于 Web 应用程序,将令牌存储在 httpOnly cookie 中,而不是本地存储中。这可以防止基于 JavaScript 的攻击(如 XSS)访问令牌。

4. 轮换代币

定期轮换和失效代币,以最大程度地减少代币泄露造成的损害。

5. 使用强客户端机密

确保您的客户ID客户秘密是强大的并且永远不会暴露给公众。使用环境变量安全地存储它们。

结论

身份验证是任何 Web 应用程序的基本方面,有多种方法可以处理它。 JWT 提供无状态、可扩展的方法,而 OAuth 提供与 Google 和 Facebook 等第三方服务的无缝集成。

通过遵循最佳安全实践,您可以确保您的身份验证系统不仅用户友好而且安全。

版本聲明 本文轉載於:https://dev.to/ivannalon/authentication-types-jwt-oauth-and-secure-integration-with-google-and-facebook-3do6?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3