node.js - 在不泄露凭据的情况下保护 Web 应用不受授权 API 的影响
问题描述
我有一个网络应用程序 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 进行身份验证?
谢谢。
ETA:我希望能够使用 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
当我在 Web 浏览器中加载 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。
解决方案
客户凭证授予只能由机密客户使用。那是因为您无法在非机密客户端上隐藏 client_secret。您的前端似乎是非机密客户端。
通常,您应该将授权代码授予与 PKCE 一起使用。但是您需要用户为此进行身份验证。
推荐阅读
- excel - 在列中查找空白单元格并将其替换为 0,如果下一行有数据,则重复下一行
- node.js - Express 不设置 cookie
- reporting-services - SSRS 零星电子邮件发送问题
- javascript - 如何使用 STOMP 在订阅时发送用户名?
- image - 如何在网络图像中创建链接以在单击时重定向到 WhatsApp 呼叫?
- amazon-web-services - 更改 AWS Glue DynamicFrame 列中的值
- c# - Xamarin 表单中的条目中的删除线文本
- c# - 如何从不同的 button_click 访问一个 button_click 内的数组?
- hasura - 如何将 Hasura v2 元数据导入/转换到 v3 服务器
- macos - MacOS QT5 / QT6 都安装了构建问题