我有一个新的SPA,它使用JWT的无状态身份验证模型。我经常被要求在身份验证流程中引用OAuth,比如要求我为每个请求发送“承载令牌”,而不是简单的令牌头,但我确实认为OAuth比简单的基于JWT的身份验证复杂得多。主要的区别是什么,我应该让JWT身份验证像OAuth那样运行吗?我也使用JWT作为我的XSRF-TOKEN来防止XSRF,但是我被要求将它们分开?我应该将它们分开吗?这里的任何帮助都将受到感谢,并且可能会为社区提供一套指导方针。
bkkx9g8r1#
TL;DR如果您有非常简单的场景,如单个客户端应用程序、单个API,那么采用OAuth 2.0可能不划算。另一方面,如果有许多不同的客户端(基于浏览器的、本机移动的、服务器端等),那么坚持OAuth 2.0规则可能比尝试部署您自己的系统更易于管理。
正如在另一个答案中所述,JWT(Learn JSON Web Tokens)只是一种令牌格式。它定义了一种紧凑且自包含的机制,用于在各方之间以一种可以验证和信任的方式传输数据,因为它是数字签名的。此外,JWT的编码规则也使这些令牌非常容易在HTTP上下文中使用。由于是自包含的(实际的令牌包含关于给定主题的信息),它们也是实现无状态身份验证机制(aka Look mum,no sessions!)的好选择。当采用这种方法时,一方必须提供的唯一东西是令牌本身,才能被授予对受保护资源的访问权,并且所讨论的令牌可以被称为承载令牌。在实践中,你所做的已经可以归类为基于承载令牌的。但是,请考虑你没有使用OAuth 2.0相关规范(参见RFC 6750)指定的承载令牌。这意味着依赖于Authorization HTTP头并使用Bearer身份验证方案。关于使用JWT防止CSRF:如果不知道确切的细节,很难确定这种做法的有效性。老实说,它似乎不正确和/或不值得。下面的文章(Cookies vs Tokens: The Definitive Guide)可能是一个有用的阅读这个主题,特别是 *XSS和XSRF保护 * 部分。最后一条建议。即使你不需要完全使用OAuth 2.0,我也强烈建议你在Authorization报头中传递你的访问令牌,而不是使用自定义报头。如果它们真的是承载令牌,请遵循RFC 6750的规则。如果不是,你可以创建一个自定义的身份验证方案,仍然使用该报头。授权标头由HTTP代理和服务器识别并进行特殊处理。因此,使用此类标头向资源服务器发送访问令牌通常会减少泄漏或意外存储已验证请求的可能性,尤其是授权标头。(来源:RFC 6819,第5.4.1节)
Authorization
Bearer
dfuffjeb2#
OAuth 2.0 定义 了 一 个 协议 , 即 指定 了 如何 传输 令牌 , JWT 定义 了 令牌 格式 。OAuth 2.0 和 " JWT 身份 验证 " 在 第 二 个 阶段 ( 客户 端 向 资源 服务 器 提供 令牌 ) 具有 相似 的 外观 :令牌 在 报头 中 传递 。但是 " JWT 身份 验证 " 不是 一 个 标准 , 并且 没有 指定 客户 机 首先 ( 第 一 阶段 ) * 如何 * 获得 令牌 。它 还 定义 了 客户 端 可以 从 称为 授权 服务 器 的 东西 * 获得 * 访问 令牌 的 各种 方式 。因此 , 真正 的 区别 在于 , JWT 只是 一 种 令牌 格式 , OAuth 2.0 是 一 种 协议 ( * 可能 * 使用 JWT 作为 令牌 格式 ) 。
u5rb5r593#
首先,我们必须区分JWT和OAuth。基本上,JWT是一种标记格式。OAuth是一种可以将JWT用作标记的授权协议。OAuth使用服务器端和客户端存储。如果要执行真实的的注销,则必须使用OAuth2。使用JWT标记进行身份验证实际上无法注销。因为您没有跟踪标记的身份验证服务器。如果您想为第三方客户端提供API,您还必须使用OAuth2。OAuth2非常灵活。JWT实现非常简单,并且不需要很长时间。如果您的应用程序需要这种灵活性,您应该使用OAuth2。但是如果您不需要这种用例场景,实现OAuth2就是浪费时间。XSRF标记始终在每个响应标头中发送到客户机。CSRF标记是否在JWT标记中发送并不重要,因为CSRF标记本身是安全的。因此,在JWT中发送CSRF标记是不必要的。
5n0oy7gb4#
智 威 汤逊( JSON Web 令牌 ) * * - 它 只是 一 种 令牌 格式 。 JWT 令牌 是 JSON 编码 的 数据 结构 , 包含 有关 颁发 者 、 主题( 权利 要求 书 ) 、它 被 签名 用于 防 篡改 和 真实 性 , 并且 可以 使用 对称 或 非 对称 方法 对其 进行 加密 以 保护 令牌 信息 。0 , 所有 设备 都 支持 , 比 SWT ( Simple Web Token ) 更 强大 。
wb1gzix05#
看起来回答这里的每个人都错过了OAUTH的讨论要点
维基百科
OAuth是一个开放的访问授权标准,通常用于互联网用户授权网站或应用程序访问他们在其他网站上的信息,但不给他们密码。[1]这种机制被谷歌、Facebook、微软和Twitter等公司用来允许用户与第三方应用程序或网站共享他们的账户信息。这里的关键点是access delegation。当存在基于id/pwd的身份验证时,为什么还要创建OAUTH,该身份验证由多因素身份验证(如OTP)支持,并且还可以由用于保护对路径的访问(如OAUTH中的作用域)和设置访问到期的JWT保护如果消费者仅通过其受信任的网站(或应用程序)访问其资源(您的端点),而这些网站(或应用程序)又托管在您的端点上,则使用OAUTH毫无意义只有当资源所有者(用户)希望通过第三方客户端(外部应用程序)访问其(您的)资源(端点)时,**如果您是OAUTH provider,您才可以进行OAUTH身份验证。**尽管您可以滥用OAUTH身份验证,但它的创建目的完全相同
access delegation
OAUTH provider
另一个重要注意事项:
您可以随意使用单词authentication来表示JWT和OAUTH,但是它们都没有提供身份验证机制。是的,一个是令牌机制,另一个是协议,但是一旦通过身份验证,它们就只用于授权(访问管理)。您必须使用OPENID类型的身份验证或您自己的客户机凭证来支持OAUTH
authentication
dwbf0jvd6#
找出 JWT 和 OAuth 之间 的 主要 区别
bq3bfh9z7#
JWT 是 一 个 开放 的 标准 , 它 定义 了 一 种 用于 在 各方 之间 安全 传输 信息 的 紧凑 且 自 包含 的 方式 。 它 是 一 个 身份 验证 协议 , 我们 允许 在 双方 ( 客户 端 和 服务 器 ) 之间 传输 编码 的 声明 ( 令牌 ) , 并 在 识别 客户 端 时 颁发 令牌 。 在 每个 后续 请求 中 , 我们 都会 发送 令牌 。而 OAuth2 是 一 个 授权 框架 , 它 有 一 个 由 框架 定义 的 一般 过程 和 设置 。您 可以 在 这里 阅读 更多 信息OAuth 还是 JWT ? 使用 哪 一 个 ? 为什么 ?
lsmd5eda8#
Jwt是一组严格的指令,用于发布和验证签名的访问令牌。令牌包含应用程序用于限制用户访问的声明另一方面,OAuth2不是一个协议,它是一个委托授权框架。请考虑非常详细的指导原则,让用户和应用程序在私有和公共设置中向其他应用程序授权特定权限。位于OAUTH2之上的OpenID Connect为您提供身份验证Authorization.it,和客户端(如网站或本机移动的应用程序)可以相互验证
注oauth2可以与jwt配合使用,实现灵活,可扩展到不同的应用程序
58wvjzkj9#
OAuth2 仅 用于 授权 , 客户 端 软件 可以 被 授权 使用 访问 令牌 代表 最终 用户 访问 资源 。
9条答案
按热度按时间bkkx9g8r1#
TL;DR如果您有非常简单的场景,如单个客户端应用程序、单个API,那么采用OAuth 2.0可能不划算。另一方面,如果有许多不同的客户端(基于浏览器的、本机移动的、服务器端等),那么坚持OAuth 2.0规则可能比尝试部署您自己的系统更易于管理。
正如在另一个答案中所述,JWT(Learn JSON Web Tokens)只是一种令牌格式。它定义了一种紧凑且自包含的机制,用于在各方之间以一种可以验证和信任的方式传输数据,因为它是数字签名的。此外,JWT的编码规则也使这些令牌非常容易在HTTP上下文中使用。
由于是自包含的(实际的令牌包含关于给定主题的信息),它们也是实现无状态身份验证机制(aka Look mum,no sessions!)的好选择。当采用这种方法时,一方必须提供的唯一东西是令牌本身,才能被授予对受保护资源的访问权,并且所讨论的令牌可以被称为承载令牌。
在实践中,你所做的已经可以归类为基于承载令牌的。但是,请考虑你没有使用OAuth 2.0相关规范(参见RFC 6750)指定的承载令牌。这意味着依赖于
Authorization
HTTP头并使用Bearer
身份验证方案。关于使用JWT防止CSRF:如果不知道确切的细节,很难确定这种做法的有效性。老实说,它似乎不正确和/或不值得。下面的文章(Cookies vs Tokens: The Definitive Guide)可能是一个有用的阅读这个主题,特别是 *XSS和XSRF保护 * 部分。
最后一条建议。即使你不需要完全使用OAuth 2.0,我也强烈建议你在
Authorization
报头中传递你的访问令牌,而不是使用自定义报头。如果它们真的是承载令牌,请遵循RFC 6750的规则。如果不是,你可以创建一个自定义的身份验证方案,仍然使用该报头。授权标头由HTTP代理和服务器识别并进行特殊处理。因此,使用此类标头向资源服务器发送访问令牌通常会减少泄漏或意外存储已验证请求的可能性,尤其是授权标头。
(来源:RFC 6819,第5.4.1节)
dfuffjeb2#
OAuth 2.0 定义 了 一 个 协议 , 即 指定 了 如何 传输 令牌 , JWT 定义 了 令牌 格式 。
OAuth 2.0 和 " JWT 身份 验证 " 在 第 二 个 阶段 ( 客户 端 向 资源 服务 器 提供 令牌 ) 具有 相似 的 外观 :令牌 在 报头 中 传递 。
但是 " JWT 身份 验证 " 不是 一 个 标准 , 并且 没有 指定 客户 机 首先 ( 第 一 阶段 ) * 如何 * 获得 令牌 。它 还 定义 了 客户 端 可以 从 称为 授权 服务 器 的 东西 * 获得 * 访问 令牌 的 各种 方式 。
因此 , 真正 的 区别 在于 , JWT 只是 一 种 令牌 格式 , OAuth 2.0 是 一 种 协议 ( * 可能 * 使用 JWT 作为 令牌 格式 ) 。
u5rb5r593#
首先,我们必须区分JWT和OAuth。基本上,JWT是一种标记格式。OAuth是一种可以将JWT用作标记的授权协议。OAuth使用服务器端和客户端存储。如果要执行真实的的注销,则必须使用OAuth2。使用JWT标记进行身份验证实际上无法注销。因为您没有跟踪标记的身份验证服务器。如果您想为第三方客户端提供API,您还必须使用OAuth2。OAuth2非常灵活。JWT实现非常简单,并且不需要很长时间。如果您的应用程序需要这种灵活性,您应该使用OAuth2。但是如果您不需要这种用例场景,实现OAuth2就是浪费时间。
XSRF标记始终在每个响应标头中发送到客户机。CSRF标记是否在JWT标记中发送并不重要,因为CSRF标记本身是安全的。因此,在JWT中发送CSRF标记是不必要的。
5n0oy7gb4#
智 威 汤逊( JSON Web 令牌 ) * * - 它 只是 一 种 令牌 格式 。 JWT 令牌 是 JSON 编码 的 数据 结构 , 包含 有关 颁发 者 、 主题( 权利 要求 书 ) 、它 被 签名 用于 防 篡改 和 真实 性 , 并且 可以 使用 对称 或 非 对称 方法 对其 进行 加密 以 保护 令牌 信息 。0 , 所有 设备 都 支持 , 比 SWT ( Simple Web Token ) 更 强大 。
wb1gzix05#
看起来回答这里的每个人都错过了OAUTH的讨论要点
维基百科
OAuth是一个开放的访问授权标准,通常用于互联网用户授权网站或应用程序访问他们在其他网站上的信息,但不给他们密码。[1]这种机制被谷歌、Facebook、微软和Twitter等公司用来允许用户与第三方应用程序或网站共享他们的账户信息。
这里的关键点是
access delegation
。当存在基于id/pwd的身份验证时,为什么还要创建OAUTH,该身份验证由多因素身份验证(如OTP)支持,并且还可以由用于保护对路径的访问(如OAUTH中的作用域)和设置访问到期的JWT保护如果消费者仅通过其受信任的网站(或应用程序)访问其资源(您的端点),而这些网站(或应用程序)又托管在您的端点上,则使用OAUTH毫无意义
只有当资源所有者(用户)希望通过第三方客户端(外部应用程序)访问其(您的)资源(端点)时,**如果您是
OAUTH provider
,您才可以进行OAUTH身份验证。**尽管您可以滥用OAUTH身份验证,但它的创建目的完全相同另一个重要注意事项:
您可以随意使用单词
authentication
来表示JWT和OAUTH,但是它们都没有提供身份验证机制。是的,一个是令牌机制,另一个是协议,但是一旦通过身份验证,它们就只用于授权(访问管理)。您必须使用OPENID类型的身份验证或您自己的客户机凭证来支持OAUTHdwbf0jvd6#
找出 JWT 和 OAuth 之间 的 主要 区别
bq3bfh9z7#
JWT 是 一 个 开放 的 标准 , 它 定义 了 一 种 用于 在 各方 之间 安全 传输 信息 的 紧凑 且 自 包含 的 方式 。 它 是 一 个 身份 验证 协议 , 我们 允许 在 双方 ( 客户 端 和 服务 器 ) 之间 传输 编码 的 声明 ( 令牌 ) , 并 在 识别 客户 端 时 颁发 令牌 。 在 每个 后续 请求 中 , 我们 都会 发送 令牌 。
而 OAuth2 是 一 个 授权 框架 , 它 有 一 个 由 框架 定义 的 一般 过程 和 设置 。
您 可以 在 这里 阅读 更多 信息
OAuth 还是 JWT ? 使用 哪 一 个 ? 为什么 ?
lsmd5eda8#
Jwt是一组严格的指令,用于发布和验证签名的访问令牌。令牌包含应用程序用于限制用户访问的声明
另一方面,OAuth2不是一个协议,它是一个委托授权框架。请考虑非常详细的指导原则,让用户和应用程序在私有和公共设置中向其他应用程序授权特定权限。位于OAUTH2之上的OpenID Connect为您提供身份验证Authorization.it,和客户端(如网站或本机移动的应用程序)可以相互验证
注oauth2可以与jwt配合使用,实现灵活,可扩展到不同的应用程序
58wvjzkj9#
OAuth2 仅 用于 授权 , 客户 端 软件 可以 被 授权 使用 访问 令牌 代表 最终 用户 访问 资源 。