【问题标题】:What is the point in sending client_id and client_secret in SPAs to auth server?将 SPA 中的 client_id 和 client_secret 发送到身份验证服务器有什么意义?
【发布时间】:2017-05-06 21:58:26
【问题描述】:

我正在尝试理解 oauth 和 openid 连接中的一些概念。为了提供一些上下文,假设我正在构建一个与一堆微服务对话的 SPA(单页应用程序)。用户需要在访问任何数据之前(通过应用程序)对自己进行身份验证,并且用户将在受信任的站点上对自己进行身份验证。

查看 oauth 2 和一些建议的流程,资源所有者密码凭据授予似乎是一个合适的候选人。

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

一些articles 我读到说你应该在请求授权时将你的client_id 和client_secret 与你的有效负载(用户名,密码......等)一起发送到授权服务器。我的问题是,这适用于 SPA 吗?不能有人检查你的 javascript 并查看你的 client_id 和 client_secret 吗?发送这些信息有什么意义吗?

【问题讨论】:

    标签: javascript oauth-2.0 single-page-application


    【解决方案1】:

    您说得对,SPA 本身无法保密或执行客户端身份验证,因此发送client_secret 毫无意义。

    在 OAuth2 世界中,这些客户端被称为公共客户端或非机密客户端,与能够执行客户端身份验证的机密客户端相反,例如,可以将客户端秘密保密的传统服务器端应用程序方式在服务器端。

    执行客户端身份验证不是强制性的,但是,您将失去基于确定客户端身份执行决策的能力。

    【讨论】:

      【解决方案2】:

      在我看来,使用 OpenID Connect 时,使用资源所有者密码凭据授予应该始终是最后的手段。您通常不希望鼓励人们将他们的凭据提供给他们信任的授权服务器以外的任何东西。

      对于 SPA,您通常选择 隐式流程。在这个流程中,用户根据需要在授权服务器上输入他们的详细信息,但是这个服务器只是直接返回一个有效的访问令牌而不是授权令牌(这需要一个客户端 id 来更改为访问令牌)

      请参阅此文档,了解各种流程:https://www.scottbrady91.com/OpenID-Connect/OpenID-Connect-Flows

      编辑

      回答 cmets 的问题:在 OpenID Connect 中,作为客户端注册过程的一部分,您必须始终向授权服务器注册重定向 uri。可以允许多个重定向 uri,但必须/应该始终将它们指定为客户端配置的一部分。

      想象一下,如果客户端在将用户发送到身份验证服务器时,可以告诉它将令牌(这是敏感的,因为它允许您代表用户执行操作)发送到它想要的任何地址,会发生什么。这将允许恶意网站窥探访问令牌并做坏事。

      我不确定您要实现什么目标,但我可以想象,如果授权服务器由您管理,您可以在注册过程中将有效的重定向 URI 添加到客户端配置中。

      接下来的步骤是(如果我理解正确的话)

      1. 用户创建帐户
      2. 用户指定域名什么的
      3. 处理注册过程的站点(为了安全起见应由您管理)保存帐户/域信息并将此域注册为授权服务器的有效重定向 URI
      4. 由于重定向域有效,用户现在可以使用授权服务器登录。

      希望对你有所帮助。

      【讨论】:

      • 从您引用的链接看来,客户端已通过重定向 url 进行了验证。我需要这是动态的。我希望用户登录并被重定向到原来的相同位置(例如注册过程中的第 2 步),这可能吗?不太确定为什么这被否决了。如果那个人发表评论会很棒。
      • 是的,我也讨厌不加评论的投票者。我将作为编辑回答您的问题,以便有更多空间。
      • @Robba 在隐式授权的情况下,在身份验证时,用户必须批准/拒绝客户端,这是一种奇怪的用户体验。假设我去 www.mysuperapp.com,它会将我重定向到 auth.mysuperapp.com,我输入我的用户名和密码,然后我看到类似“MySuperApp 想要访问 MySuperApp.com”
      • 这个一般是授权服务器的设置。我不确定您使用的是哪一个,但您可以简单地配置您不需要显示该屏幕。
      猜你喜欢
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      • 2022-01-24
      • 2018-07-23
      • 2019-07-24
      • 2022-10-04
      相关资源
      最近更新 更多