客户端密码是否是在授权代码流中刷新 SPA 访问令牌的安全方法?
Is client secret ever a secure method to refresh access token for an SPA in authorization code flow?
在 MSDN 的 the article 中,它表示需要执行以下请求才能使用 Web 应用程序的刷新令牌获取新的访问令牌。
POST /.../v2.0/token
Content-Type: application/x-www-form-urlencoded
?client_id=...
&scope=wide_and_proud
&refresh_token=OAAABAAAAiL9Kn2Z27UubvWFP...
&grant_type=refresh_token
&client_secret=hakuna_matata
这意味着我们需要将客户端的秘密分发到前端应用程序,这对我来说会打开一个巨大的安全漏洞。我想争辩说我们应该 永远不会 向我们的 SPA 提供有关客户机密的信息。
我已经在谷歌上搜索了几天,所有资源都以某种方式指向我们提供客户机密的情况。但是,我无法摆脱这种感觉,即在使用授权代码流进行 SPA 身份验证的情况下,它不应该应用。但是,我没有看到专门讨论该组合的文档:“spa refresh token authorization code flow”。
您认为 SPA 不应使用客户端密码是对的。它还应避免使用刷新令牌。问题是 SPA 没有安全的地方来存储此信息。
PKCE
SPA 是一个 public 客户端,可以使用一次性运行时密码而不是客户端密码字段。有关详细信息,请参阅此 Proof Key for Code Exchange 摘要。这将解决最初的问题。
令牌处理程序模式
如果您想更进一步,还有一个更广泛的问题是 SPA 需要一个服务器组件 (API) 来照管其秘密和令牌。然后 SPA 可以发出这样的请求,API 可以处理敏感数据:
POST /login/end { url: location.href }
如果这是以 API 驱动的方式完成的,它也非常适合 SPA 架构的目标,尽管它确实添加了更多移动部件。有关更多信息,请参阅这些资源:
另请注意,这是一种通用设计模式。它将与 Microsoft 和任何其他授权服务器一起使用。
令牌处理程序第一步
您可以仅从这些步骤开始,这也会将刷新令牌排除在 SPA 之外:
- SPA 在 /login/start 调用 API 以获取重定向 URI
- API 使用状态 + PKCE 参数设置临时 cookie
- SPA 重定向并接收响应
- SPA 在 /login/end
再次调用 API
- API 然后将客户端密码提供给授权服务器
- API 将刷新令牌存储在安全 cookie 中
- API returns SPA 的短期访问令牌
在 MSDN 的 the article 中,它表示需要执行以下请求才能使用 Web 应用程序的刷新令牌获取新的访问令牌。
POST /.../v2.0/token
Content-Type: application/x-www-form-urlencoded?client_id=...
&scope=wide_and_proud
&refresh_token=OAAABAAAAiL9Kn2Z27UubvWFP...
&grant_type=refresh_token
&client_secret=hakuna_matata
这意味着我们需要将客户端的秘密分发到前端应用程序,这对我来说会打开一个巨大的安全漏洞。我想争辩说我们应该 永远不会 向我们的 SPA 提供有关客户机密的信息。
我已经在谷歌上搜索了几天,所有资源都以某种方式指向我们提供客户机密的情况。但是,我无法摆脱这种感觉,即在使用授权代码流进行 SPA 身份验证的情况下,它不应该应用。但是,我没有看到专门讨论该组合的文档:“spa refresh token authorization code flow”。
您认为 SPA 不应使用客户端密码是对的。它还应避免使用刷新令牌。问题是 SPA 没有安全的地方来存储此信息。
PKCE
SPA 是一个 public 客户端,可以使用一次性运行时密码而不是客户端密码字段。有关详细信息,请参阅此 Proof Key for Code Exchange 摘要。这将解决最初的问题。
令牌处理程序模式
如果您想更进一步,还有一个更广泛的问题是 SPA 需要一个服务器组件 (API) 来照管其秘密和令牌。然后 SPA 可以发出这样的请求,API 可以处理敏感数据:
POST /login/end { url: location.href }
如果这是以 API 驱动的方式完成的,它也非常适合 SPA 架构的目标,尽管它确实添加了更多移动部件。有关更多信息,请参阅这些资源:
另请注意,这是一种通用设计模式。它将与 Microsoft 和任何其他授权服务器一起使用。
令牌处理程序第一步
您可以仅从这些步骤开始,这也会将刷新令牌排除在 SPA 之外:
- SPA 在 /login/start 调用 API 以获取重定向 URI
- API 使用状态 + PKCE 参数设置临时 cookie
- SPA 重定向并接收响应
- SPA 在 /login/end 再次调用 API
- API 然后将客户端密码提供给授权服务器
- API 将刷新令牌存储在安全 cookie 中
- API returns SPA 的短期访问令牌