Authentication OAuth2双腿客户端凭据流和;“机密”;客户机--如何隐藏客户机的秘密

Authentication OAuth2双腿客户端凭据流和;“机密”;客户机--如何隐藏客户机的秘密,authentication,oauth-2.0,Authentication,Oauth 2.0,我有一个RESTAPI,它接受本质上是匿名的调查响应,即来自未经身份验证的用户。我的组织希望允许一些(可能12个)合作伙伴开发客户端应用程序来收集响应并将其发送到api。我希望api对这些客户机进行身份验证,即验证该客户机是我们授权的12个客户机之一。我计划使用OAuth2“客户机凭据”流,为每个客户机提供唯一的客户机id和客户机机密。客户端将使用其客户端id和客户端机密请求令牌,然后在后续api调用中使用该令牌。客户机需要是基于https服务器的应用程序,可以隐藏客户机的秘密——即OAuth2

我有一个RESTAPI,它接受本质上是匿名的调查响应,即来自未经身份验证的用户。我的组织希望允许一些(可能12个)合作伙伴开发客户端应用程序来收集响应并将其发送到api。我希望api对这些客户机进行身份验证,即验证该客户机是我们授权的12个客户机之一。我计划使用OAuth2“客户机凭据”流,为每个客户机提供唯一的客户机id和客户机机密。客户端将使用其客户端id和客户端机密请求令牌,然后在后续api调用中使用该令牌。客户机需要是基于https服务器的应用程序,可以隐藏客户机的秘密——即OAuth2规范()中的“机密客户机”

但是,在客户端凭据流中,客户端的机密真的是机密的吗?据我所知,传递client_id和client_secret的推荐方法是在HTTP Basic auth头中作为base64编码值。如果攻击者浏览该客户端应用程序以提交SuryKey响应,难道他不能使用浏览器开发工具查看base64编码的client\u id:client\u secret值,对其进行解码,并使用相同的client\u id和client\u secret构建自己的应用程序吗

我知道我可以使用CORS将基于浏览器的请求限制为来自12个授权域的请求。所以我想我是在问那些试图模仿某个授权客户端的非浏览器攻击

所以我的问题是:

  • 这个客户端id:client\u secret的可见base-64编码版本在普通OAUth2两条腿的客户端凭据流中存在漏洞(即没有最终用户授权客户端),我说的对吗
  • 我认为我们可以使用签名令牌方法(可能是JWT),而不是客户端凭据,类似于所描述的,其中:
    • 客户端服务器和api服务器具有共享私钥
    • 客户端生成一个令牌,用私钥的散列加上时间戳对其进行签名。客户端在api请求中发送该令牌,以及用于哈希的“请求时间戳”
    • api服务器验证令牌,使用私钥和“请求时间戳”验证哈希。服务器只接受最近的时间戳(例如,在最后2秒内),以防止重播攻击
    • 这听起来合理吗
  • 有人能想出另一种方法将api限制为仅授权客户端吗

  • 在HTTPS传输中,只要HTTP Basic auth头的传输中受到“保护”。你可能需要一些帮助