将SPA中的client_id和client_secret发送到auth服务器有什么意义?

时间:2016-12-21 13:02:53

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

我试图了解oauth和openid connect中的一些概念。为了提供一些上下文,假设我正在构建一个与一堆微服务对话的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是什么?发送这些信息有什么意义吗?

2 个答案:

答案 0 :(得分:3)

你是对的,它自己的SPA无法保密或执行客户身份验证,所以发送client_secret毫无意义。

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

执行客户端身份验证不是强制性的,但是,您将无法确定客户端身份,从而无法执行决策。

答案 1 :(得分:2)

使用OpenID Connect时,使用资源所有者密码凭据格兰特应该始终是最后的选择。您通常不希望鼓励人们将其凭据提供给他们信任的授权服务器以外的任何其他内容。

对于SPA,您通常会选择隐含流量。在此流程中,用户根据需要在授权服务器上输入其详细信息,但此服务器只是直接返回有效的访问令牌而不是授权令牌(需要将客户端ID更改为访问令牌)

例如,请参阅有关各种流程的文档:https://www.scottbrady91.com/OpenID-Connect/OpenID-Connect-Flows

修改

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

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

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

然后是步骤(如果我理解正确的话)

  1. 用户创建帐户
  2. 用户指定域名或其他内容
  3. 处理注册过程的网站(应由您管理安全)保存帐户/域信息,并将此域注册为授权服务器的有效重定向URI
  4. 用户现在可以使用授权服务器登录,因为重定向域有效。
  5. 我希望这有所帮助。