客户ID和秘密

时间:2018-01-18 16:18:09

标签: c# asp.net oauth jwt umbraco

Request URL:
POST https://example.com/oauth/token
Request Headers:
  Content-Type: application/x-www-form-urlencoded
Request POST Body:
grant_type=password&username=joebloggs&
   password=password1234&client_id=myclient&client_secret=myclientsecret

Response:
{
  "access_token": "omitted for brevity",
  "token_type": "bearer",
  "expires_in": 1200,
  "refresh_token": "b3cc9c66b86340c5b743f2a7cec9d2f1"
}

我想使用从单页应用发送的JWT来保护我的Umbraco web api端点。我发现this lib可以满足我的大多数需求。

由于我使用InMemoryOAuthClientStore文档声明必须为身份验证请求提供客户端ID和密码(我认为这用于匹配商店中的OAuthClient?):

client_id =有效的客户端ID(仅在配置客户端存储时才需要)

client_secret =有效的客户端密钥(仅在配置客户端存储且客户端为“安全”时才需要)

我想知道它们是如何使用的。如果我使用来自客户端的AJAX调用向https://example.com/oauth/token进行此授权调用,我需要在客户端存储id和secret。我的直觉告诉我,这不是打算如何使用。

另一方面,在这种情况下,客户端ID和密码都附带用户凭据,因此如果没有有效的用户名和密码,它们就毫无价值。

有人请说清楚。

2 个答案:

答案 0 :(得分:3)

有些客户端能够将某些信息(客户端机密)保密,有些则不保密。例如,如果您通过ajax直接从javascript向oauth端点发出请求 - 此客户端不是" secure"。它无法私下存储客户端密钥,因为任何人都可以直接在javascript代码中或通过在浏览器开发工具中观察请求来查看此秘密。对于此类客户端(移动应用程序是另一个示例),在任何流程中使用客户端密钥都没有任何意义,包括"密码"流。

" secure"的例子客户端是您拥有的Web服务器。因此,您不能直接从javascript向oauth端点发出请求,而是将凭据发送到服务器,然后服务器向oauth端点发出请求。这个客户是"安全"从某种意义上说,它能够私下存储客户机密。对于这样的客户来说,确实有意义(甚至要求我说)要求客户保密。

简而言之,你的直觉是正确的 - 你不应该在你的情况下使用客户机密,因为它没有任何用处。

现在,即使您不使用客户端密钥,您仍然可以单独使用client_id。例如,您可以为不同的客户发出一组不同的声明。请注意,客户端ID是公共信息,因此您不应仅基于client_id做出任何敏感决策 - 它不可信任。

另请注意"密码" flow是最后的选择,只能由您拥有的客户端使用,并且当没有其他流可用时。

答案 1 :(得分:0)

使用用户名和密码请求令牌然后在请求端存储该令牌有两个主要原因。

  1. 额外的安全性。用户/密码组合不会随每个发送 请求,但每1200秒/分钟只需一次。
  2. 处理请求的服务器只需检查其有效性 令牌而不是每个的性能重密码哈希 请求。
  3. 还有其他原因,请参阅以下链接。

    <强>更新

    client_id是应用的公共标识符。 client_secret是仅为应用程序和授权服务器所知的秘密。以下链接中的更多信息。