”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 身份验证类型:JWT、OAuth 以及与 Google 和 Facebook 的安全集成

身份验证类型:JWT、OAuth 以及与 Google 和 Facebook 的安全集成

发布于2024-10-31
浏览:650

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]删除
最新教程 更多>
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
    编程 发布于2025-03-14
  • Android如何向PHP服务器发送POST数据?
    Android如何向PHP服务器发送POST数据?
    在android apache httpclient(已弃用) httpclient httpclient = new defaulthttpclient(); httppost httppost = new httppost(“ http://www.yoursite.com/script.p...
    编程 发布于2025-03-14
  • 大批
    大批
    [2 数组是对象,因此它们在JS中也具有方法。 切片(开始):在新数组中提取部分数组,而无需突变原始数组。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    编程 发布于2025-03-14
  • 我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    将我的加密库从mcrypt升级到openssl 问题:是否可以将我的加密库从McRypt升级到OpenSSL?如果是这样,如何?答案:是的,可以将您的Encryption库从McRypt升级到OpenSSL。可以使用openssl。附加说明: [openssl_decrypt()函数要求iv参...
    编程 发布于2025-03-14
  • Java是否允许多种返回类型:仔细研究通用方法?
    Java是否允许多种返回类型:仔细研究通用方法?
    在Java中的多个返回类型:一种误解类型:在Java编程中揭示,在Java编程中,Peculiar方法签名可能会出现,可能会出现,使开发人员陷入困境,使开发人员陷入困境。 getResult(string s); ,其中foo是自定义类。该方法声明似乎拥有两种返回类型:列表和E。但这确实是如此吗...
    编程 发布于2025-03-14
  • 为什么PYTZ最初显示出意外的时区偏移?
    为什么PYTZ最初显示出意外的时区偏移?
    与pytz 最初从pytz获得特定的偏移。例如,亚洲/hong_kong最初显示一个七个小时37分钟的偏移: 差异源利用本地化将时区分配给日期,使用了适当的时区名称和偏移量。但是,直接使用DateTime构造器分配时区不允许进行正确的调整。 example pytz.timezone(...
    编程 发布于2025-03-14
  • 如何检查对象是否具有Python中的特定属性?
    如何检查对象是否具有Python中的特定属性?
    方法来确定对象属性存在寻求一种方法来验证对象中特定属性的存在。考虑以下示例,其中尝试访问不确定属性会引起错误: >>> a = someClass() >>> A.property Trackback(最近的最新电话): 文件“ ”,第1行, AttributeError: SomeClass...
    编程 发布于2025-03-14
  • 如何在Java字符串中有效替换多个子字符串?
    如何在Java字符串中有效替换多个子字符串?
    在java 中有效地替换多个substring,需要在需要替换一个字符串中的多个substring的情况下,很容易求助于重复应用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    编程 发布于2025-03-14
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-03-14
  • 如何使用Regex在PHP中有效地提取括号内的文本
    如何使用Regex在PHP中有效地提取括号内的文本
    php:在括号内提取文本在处理括号内的文本时,找到最有效的解决方案是必不可少的。一种方法是利用PHP的字符串操作函数,如下所示: 作为替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式来搜索特...
    编程 发布于2025-03-14
  • 如何使用替换指令在GO MOD中解析模块路径差异?
    如何使用替换指令在GO MOD中解析模块路径差异?
    在使用GO MOD时,在GO MOD 中克服模块路径差异时,可能会遇到冲突,其中可能会遇到一个冲突,其中3派对软件包将另一个带有导入套件的path package the Imptioned package the Imptioned package the Imported tocted pac...
    编程 发布于2025-03-14
  • 如何使用PHP将斑点(图像)正确插入MySQL?
    如何使用PHP将斑点(图像)正确插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call ...
    编程 发布于2025-03-14
  • 对象拟合:IE和Edge中的封面失败,如何修复?
    对象拟合:IE和Edge中的封面失败,如何修复?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    编程 发布于2025-03-14
  • 为什么使用Firefox后退按钮时JavaScript执行停止?
    为什么使用Firefox后退按钮时JavaScript执行停止?
    导航历史记录问题:JavaScript使用Firefox Back Back 此行为是由浏览器缓存JavaScript资源引起的。要解决此问题并确保在后续页面访问中执行脚本,Firefox用户应设置一个空功能。 警报'); }; alert('inline Alert')...
    编程 发布于2025-03-14

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3