【问题标题】:What is the difference between OAuth based and Token based authentication?基于 OAuth 和基于 Token 的身份验证有什么区别?
【发布时间】:2016-04-19 11:41:32
【问题描述】:

我认为 OAuth 基本上是基于令牌的身份验证规范,但大多数时候框架的行为似乎它们之间存在差异。例如,如下图所示,Jhipster 询问是使用基于 OAuth 的身份验证还是基于令牌的身份验证。

这些不是一回事吗?由于两者都在其实现中包含令牌,究竟有什么区别?

【问题讨论】:

    标签: authentication oauth oauth-2.0 access-token jwt


    【解决方案1】:

    这是一个很好的问题——关于令牌和 OAuth 存在很多混淆。

    首先,当您提到 OAuth 时,您可能指的是 OAuth2 standard。这是 OAuth 协议的最新版本,也是大多数人在说“OAuth”时专门谈论的内容。

    OAuth 协议支持多种不同类型的身份验证和授权(准确地说是 4 种)。

    其次,OAuth 协议通过令牌对用户进行身份验证来工作。这里的想法是这样的:

    不是让您的用户在每次请求时都将他们的实际凭据发送到您的服务器(就像他们使用基本身份验证一样,用户在每次请求时将他们的用户名/密码发送到服务器),而使用 OAuth,您首先交换您的用户'token' 的凭据,然后根据此 'token' 对用户进行身份验证。

    OAuth 的理念是,通过要求用户减少通过网络传递机密凭据的频率,可以减少坏事的发生。 (无论如何,这就是这个想法。)

    现在,令牌在这里发挥作用:OAuth 规范是围绕令牌的概念构建的,但没有具体说明令牌是什么。

    在最“一般”的意义上,令牌只是一个唯一标识用户的字符串。就是这样。

    人们意识到了这一点,并开发了一种创建代币的新标准,称为JSON Web Token standard。该标准基本上提供了一组规则,用于以非常特定的方式创建令牌,这使得令牌对您更有用。

    JWT 让您可以执行以下操作:

    • 对令牌进行加密签名,以便您知道令牌没有被用户篡改。
    • 加密令牌,使内容无法以纯文本形式读取。
    • 以标准方式将 JSON 数据嵌入到令牌字符串中。

    现在,在大多数情况下:开发社区中的几乎每个人都同意,如果您使用任何类型的 OAuth,那么您使用的令牌应该是 JSON Web 令牌。

    ===========

    好的!现在我们已经介绍了背景故事,让我来回答您的问题。

    您在上面所做的选择是您是否要启用完整的 OAuth2 规范以进行身份​​验证/授权(这非常复杂),或者您是否只是想要一些基本的“令牌身份验证”。

    由于 OAuth 协议提供了多种不同的方式来以符合标准的方式进行身份验证,因此它为大多数身份验证系统增加了很多复杂性。

    因此,许多框架都提供了 OAuth2 密码授予流程的“简化”版本,这本质上是一种简单的方法,其中:

    • 用户通过 /login 等 URL 将其用户名/密码发送到您的服务器。
    • 您的服务器为用户生成 JWT 令牌。
    • 您的服务器将该令牌返回给用户。
    • 用户将此令牌存储在他们的 cookie、移动设备或可能的 API 服务器中,并在其中使用它来发出请求。

    再次重申:上面的流程不符合 OAuth,但它是一个稍微简单的版本,仍然使用令牌。

    这里的重点是令牌 (JWT) 通常很有用,不需要与 OAuth 流程配对。

    我知道这是一堵文字墙,但希望它能更深入地回答您的问题 =)

    【讨论】:

    • 很好的答案,但应该提到的是,OAuth2 本身不能用于验证用户(除非 API 端点可用,否则客户端对用户一无所知)。必须实现 OpenID Connect 才能执行基于 OAuth2 的身份验证
    • 这是正确的。我没有详细说明,因为我不想过度混淆 OP。但你是 100% 正确的。
    • @rdegges,您能解释一下为什么您解释的简单流程不符合 OAuth 吗?您需要添加什么使其符合 OAuth 标准?
    • @hattenn 这是一篇文章 (oauth.net/articles/authentication),它提供了一些关于它为什么不符合 oAuth 的详细信息:
    • @Mikz 你不正确。这取决于您使用的 OAuth 类型。有不同的授权类型,它们以不同的方式使用。由于 OP 提出的问题,我包含了有关他的问题所指的客户端凭据授予类型的详细信息。显然还有其他模式,但它们都涉及 IDP 的凭据。
    【解决方案2】:

    当您从安全的 Web 服务请求资源时,您可以在调用时提供身份验证令牌。令牌充当访问资源的“密码”。

    OAuth 只是特定类型的基于令牌的身份验证方法。

    【讨论】:

      【解决方案3】:

      OAuth 是授权而不是身份验证的规范

      OAuth 2.0 是授权规范,但不是身份验证规范。 RFC 6749,3.1. Authorization Endpoint 明确表示如下:

      授权端点用于与资源所有者交互 并获得授权。授权服务器必须首先 验证资源所有者的身份。的方式 授权服务器对资源所有者进行身份验证(例如,用户名 和密码登录、会话 cookie)超出了此范围 规范

      仅当您想向您的 api 授予对第三方服务的访问权限时,才使用 OAuth。即使您使用 OAuth,您也需要某种身份验证(基于令牌或基于会话等)来验证使用。 OAuth 不是为身份验证而设计的。

      看到这个question

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-08
        • 2015-12-09
        • 2012-03-21
        • 2023-02-05
        • 2020-11-21
        • 1970-01-01
        • 2012-12-12
        • 1970-01-01
        相关资源
        最近更新 更多