【发布时间】:2021-10-27 23:40:40
【问题描述】:
我有一个网络应用 MyWebApp。
还有两个 API:MyAuthAPI 和 MyServiceAPI,都是 RESTful NodeJS。 MyAuthAPI 使用 HashiCorp Vault 作为 OAuth2 的令牌存储。
MyServiceAPI 具有可供经过身份验证的客户端使用的 CRUD 操作。
在 MyWebApp 上不需要(或不需要)人工登录。任何人都可以通过浏览器访问 MyWebApp 并运行该服务。
目前,这是(非常不安全的)流程: MyWebApp 将 clientid 和 clientsecret 发送到 MyAuthAPI 以检索令牌。然后使用此令牌与 MyServiceAPI 进行通信。
明显的缺点是任何人都可以通过在 Web 浏览器中查看开发人员工具来捕获 clientid 和 clientsecret。然后,他们可以使用它们通过 MyAuthAPI 进行身份验证,生成自己的令牌,并在不涉及 MyWebApp 的情况下调用 MyServiceAPI。
那么,我如何最好地保护整个应用程序,以便在不泄露凭据的情况下安全可靠地对 MyWebApp 进行身份验证?
谢谢。
预计到达时间: 我希望能够使用 MyAuthAPI 对 MyWebApp 进行身份验证,然后使用生成的令牌连接到 MyServiceAPI。但我不希望任何人都可以拦截这些凭据 - 目前它们可以在请求标头中看到为“授权:基本”
必须保护 MyServiceAPI 端点,以便只有经过身份验证的客户端才能访问它们。但是,当该客户端 (MyWebApp) 是公共网站时,如何在不显示凭据的情况下进行身份验证?
ETA2:
https://mywebapp.com is MyWebApp which is a React application.
https://myauthapi.com hosts MyAuthAPI
https://myserviceapi.com hosts MyServiceAPI
当我在网络浏览器中加载 mywebapp.com 时,它会使用 myauthapi.com/oauth/token 进行身份验证以获取令牌。目前,它通过在标头 Authorization: Basic 中发送凭据来实现这一点
然后保存返回的令牌。 然后,Web 应用程序尝试使用此令牌从 MyServiceApi 上的端点获取数据: 授权:承载
GET https://myserviceapi.com/objects
or POST myserviceapi.com/objects
or GET myserviceapi.com/objects/objectid
or DELETE myserviceapi.com/objects/objectid
MyServiceAPI 使用 MyAuthAPI 验证令牌,但这不是面向公众的,因此没有问题。
问题是,正如您在 Chrome 中的开发者工具控制台的附加屏幕截图中看到的那样,任何使用 Web 应用程序的人都可以看到包含凭据的 Authorization 标头,然后可以使用这些凭据以编程方式访问auth API 生成一个令牌,然后可以在服务 API 端点上使用该令牌。 我想将对 API 服务器的所有访问限制为仅来自 mywebapp.com 上的特定应用程序,例如 MyWebApp。
【问题讨论】:
-
请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。
-
@JoyoWaseem 我添加了更多信息。是不是更清楚了?
-
MyServiceAPI 不是 MyWebApp 中的服务?如果是,你是什么意思:“......并在不涉及 MyWebApp 的情况下调用 MyServiceAPI”?您不是说“在不涉及 MyAuthAPI 的情况下调用 MyServiceAPI”吗?
-
简而言之,您无法在客户端应用程序中保护您的 API 密钥!你可以像@OhadR 所说的那样使用body。建议使用 Nginx 作为节点 RestApi 的代理服务器,然后以某种方式配置 Nginx,以便它可以接收来自您希望允许的域的请求。
标签: node.js authentication oauth-2.0 credentials hashicorp-vault