将 SPA 中的 client_id 和 client_secret 发送到 auth 服务器有什么意义?
What is the point in sending client_id and client_secret in SPAs to auth server?
我想了解 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 是什么吗?发送此信息有什么意义吗?
你说得对,SPA 本身无法保密或执行客户端身份验证,因此发送 client_secret
.
毫无意义
在 OAuth2 世界中,这些客户端被称为 public 客户端或非机密客户端,与能够执行客户端身份验证的机密客户端相反,例如,可以保留的传统服务器端应用程序在服务器端以安全的方式提供客户端机密。
执行客户端身份验证不是强制性的,但是,您将无法根据确定的客户端身份来执行决策。
在我看来,使用 OpenID Connect 时,使用资源所有者密码凭据授予应该始终是最后的手段。您通常不希望鼓励人们向除他们信任的授权服务器以外的任何东西提供他们的凭据。
对于 SPA,您通常会选择 隐式流程。在此流程中,用户根据需要在授权服务器上输入他们的详细信息,但此服务器只是直接 returns 一个有效的访问令牌而不是授权令牌(这需要客户端 ID 才能更改为访问令牌)
有关各种流程的示例,请参阅此文档:https://www.scottbrady91.com/OpenID-Connect/OpenID-Connect-Flows
编辑
根据评论回答您的问题:在 OpenID Connect 中,作为客户端注册过程的一部分,您必须始终向授权服务器注册重定向 uri。允许多个重定向 uri 是可能的,但它们 must/should 始终被指定为客户端配置的一部分。
想象一下,如果客户端在将用户发送到身份验证服务器时,可以告诉它发送令牌(这是敏感的,因为它允许您代表用户执行操作)到任何地址,会发生什么想要。这将允许恶意网站窥探访问令牌并做坏事。
我不确定您想要实现什么,但我可以想象,如果授权服务器由您管理,您可以在注册过程中将有效的重定向 URI 添加到客户端配置中。
接下来的步骤是(如果我理解正确的话)
- 用户创建一个帐户
- 用户指定了域名什么的
- 处理注册过程的站点(为了安全起见应该由您管理)保存 account/domain 信息并将此域注册为授权服务器的有效重定向 URI
- 用户现在可以使用授权服务器登录,因为重定向域有效。
希望对您有所帮助。
我想了解 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 是什么吗?发送此信息有什么意义吗?
你说得对,SPA 本身无法保密或执行客户端身份验证,因此发送 client_secret
.
在 OAuth2 世界中,这些客户端被称为 public 客户端或非机密客户端,与能够执行客户端身份验证的机密客户端相反,例如,可以保留的传统服务器端应用程序在服务器端以安全的方式提供客户端机密。
执行客户端身份验证不是强制性的,但是,您将无法根据确定的客户端身份来执行决策。
在我看来,使用 OpenID Connect 时,使用资源所有者密码凭据授予应该始终是最后的手段。您通常不希望鼓励人们向除他们信任的授权服务器以外的任何东西提供他们的凭据。
对于 SPA,您通常会选择 隐式流程。在此流程中,用户根据需要在授权服务器上输入他们的详细信息,但此服务器只是直接 returns 一个有效的访问令牌而不是授权令牌(这需要客户端 ID 才能更改为访问令牌)
有关各种流程的示例,请参阅此文档:https://www.scottbrady91.com/OpenID-Connect/OpenID-Connect-Flows
编辑
根据评论回答您的问题:在 OpenID Connect 中,作为客户端注册过程的一部分,您必须始终向授权服务器注册重定向 uri。允许多个重定向 uri 是可能的,但它们 must/should 始终被指定为客户端配置的一部分。
想象一下,如果客户端在将用户发送到身份验证服务器时,可以告诉它发送令牌(这是敏感的,因为它允许您代表用户执行操作)到任何地址,会发生什么想要。这将允许恶意网站窥探访问令牌并做坏事。
我不确定您想要实现什么,但我可以想象,如果授权服务器由您管理,您可以在注册过程中将有效的重定向 URI 添加到客户端配置中。
接下来的步骤是(如果我理解正确的话)
- 用户创建一个帐户
- 用户指定了域名什么的
- 处理注册过程的站点(为了安全起见应该由您管理)保存 account/domain 信息并将此域注册为授权服务器的有效重定向 URI
- 用户现在可以使用授权服务器登录,因为重定向域有效。
希望对您有所帮助。