"资源所有者密码流"和"客户端凭据流"之间的区别

ln *_*n e 52 oauth-2.0

"资源所有者密码流"和"客户端凭据流"之间的区别对我来说似乎不太清楚.前者似乎将密码凭证转发给服务器进行验证,而后者也以某种方式对服务器进行身份验证,但规范没有指定此处使用的方法.此流程是否适用于cookie会话?规范并没有真正提供一个明确的用例.

从OAuth 2.0规范:

 +---------+                                  +---------------+
 |         |                                  |               |
 |         |>--(A)- Client Authentication --->| Authorization |
 | Client  |                                  |     Server    |
 |         |<--(B)---- Access Token ---------<|               |
 |         |                                  |               |
 +---------+                                  +---------------+

                 Figure 6: Client Credentials Flow
Run Code Online (Sandbox Code Playgroud)

 +----------+
 | Resource |
 |  Owner   |
 |          |
 +----------+
      v
      |    Resource Owner
     (A) Password Credentials
      |
      v
 +---------+                                  +---------------+
 |         |>--(B)---- Resource Owner ------->|               |
 |         |         Password Credentials     | Authorization |
 | Client  |                                  |     Server    |
 |         |<--(C)---- Access Token ---------<|               |
 |         |    (w/ Optional Refresh Token)   |               |
 +---------+                                  +---------------+

        Figure 5: Resource Owner Password Credentials Flow
Run Code Online (Sandbox Code Playgroud)

use*_*829 40

客户端凭据流仅需要client_id和client_secret.资源所有者流程需要用户的密码.

客户端凭证流允许应用程序从用户的上下文中获取令牌.

  • 请注意不再推荐 RO 流程 https://www.scottbrady91.com/OAuth/Why-the-Resource-Owner-Password-Credentials-Grant-Type-is-not-Authentication-nor-Suitable-for-Modern -应用 (3认同)
  • *资源所有者流程需要用户的密码。” - 我认为进一步澄清这一点很有帮助。资源所有者流程需要用户的用户名、密码以及客户端的 client_id 和 client_secret。 (3认同)

Ste*_*ams 23

一个很好的例子如下:

假设您是一家名为AllStats的统计公司,它拥有自己的用户群,每个用户都有自己的用户名和密码.AllStats拥有自己的现有网站,可以自己动手制作API.但是,AllStats现在想要发布移动应用程序.

由于移动应用程序将是第一方应用程序(请参阅:由AllStats开发),因此资源所有者密码流非常有意义.您希望用户获得与应用程序一起流动的屏幕(用户名,密码),而不是将其踢到auth服务器(然后返回应用程序).用户在输入用户名/密码时会信任该应用程序,因为它是第一方应用程序.

我喜欢将资源所有者密码流视为第一方应用程序开发人员将使用的流程,而客户端凭据流则是第三方应用程序开发人员将使用的流程.

想象一下,如果Facebook应用程序要求您使用客户端凭据流而不是仅向您显示用户名/密码表单.看起来有点奇怪,是吗?

现在,如果想象你下载了一个有Facebook集成的第三方应用程序.如果应用程序提示您输入用户名/密码而不是使用Client Credential Flow UI,我想你(以及大多数人)会非常谨慎.

FWIW,这并不是说第一方应用程序不使用客户端凭据流.而是尝试绘制资源所有者密码流何时使用的真实场景(以及整体概括).

  • 我认为您将"客户端凭据"流与"授权代码"授权混淆.实际上,"客户端凭据"授权甚至不会要求用户名/密码,并且没有您提到的"客户端凭据UI",因为它用于机器到机器的身份验证. (25认同)
  • 关于第一方应用程序和资源所有者密码流的部分是清楚和正确的,但是您可能错误地使用隐式流的客户端凭据流? (3认同)
  • 我不喜欢对移动应用程序使用资源所有者密码,因为它是公共客户端(您的客户端密钥可能会在资源所有者站点上泄露)。这样,坏人就可以使用此资源所有者密码流程进行暴力密码攻击。我认为所有者密码流应该仅在第一个应用程序中作为私人客户端使用。 (2认同)