首页 > 解决方案 > 在不泄露凭据的情况下保护 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。

标签: node.jsauthenticationoauth-2.0credentialshashicorp-vault

解决方案


客户凭证授予只能由机密客户使用。那是因为您无法在非机密客户端上隐藏 client_secret。您的前端似乎是非机密客户端。

通常,您应该将授权代码授予与 PKCE 一起使用。但是您需要用户为此进行身份验证。


推荐阅读