保护JS客户端SDK

时间:2017-02-10 18:39:16

标签: javascript api security reactjs client-side

我正在开发一个React-Redux网络应用程序,该应用程序与AWS Cognito集成用于用户身份验证/数据存储以及Shopify API,因此用户可以通过我们的网站购买物品。

使用两个SDK(CognitoShopify),我遇到了一个问题:他们的核心功能将幕后数据附加到localStorage,要求两个SDK都运行客户端-侧。

但是完全在客户端运行此代码意味着两个API所需的API令牌都是完全不安全的,这样有人可以从我的捆绑中抓取它们然后验证/填充购物车/查看库存/随处可以的任何东西(右?)。

我在两个回购中都写了一些问题来指出这一点。 Here's the more recent one, on Shopify。我在SO上查看了similar questions,但我找不到任何直接解决这些自定义SDK /根深蒂固localStorage用法的内容,我开始怀疑自己是否遗漏/误解关于客户端安全性的事情,所以我想我应该问那些了解更多信息的人。

我感兴趣的是,抽象地说,是否有一种很好的方法可以保护像这样的客户端SDK。一些想法:

  • 最初,我试图通过服务器代理所有请求,但后来localStorage功能无效,我不得不在请求后伪造它并添加一大堆代码SDK旨在照顾。这被证明是非常困难/混乱,特别是对于Cognito。

  • 我还在考虑创建一个服务器端端点,它只返回凭据并阻止来自域外的请求。在这种情况下,信用证不会出现在捆绑中,但是一旦提出凭证请求,网站上的某个人最终是否可以扫描这些信用证?

  • 这些秘密密钥实际上并不需要是安全的,因为添加到Shopify购物车或使用应用程序注册用户不需要是安全的操作吗?我只是担心我显然不知道用户可以使用这些凭据进行的全部操作,并且保持秘密是一种明显的最佳做法。

谢谢!

2 个答案:

答案 0 :(得分:0)

你不能把密钥等放在.env文件中吗?这样,没有人能够看到你在那里存储了什么键。然后,您可以通过process.env.YOUR_VAR

访问您的密钥

对于Cognito,您可以在.env文件中存储用户池ID,应用客户端ID,身份池ID等内容。

dotenv的NPM包可以在这里找到:NPM dotenv

此外,您目前正在储存哪些超级秘密的东西?通过“API令牌”,您是指在向Cognito进行身份验证后获得的OpenId令牌吗?

答案 1 :(得分:0)

我可以为此回应Cognito部分。您的AWS密钥和访问密钥未存储在客户端中。对于您的React.js应用,您只需要在应用中使用Cognito用户池ID和应用客户端ID。这些是唯一暴露给用户的键。

我在这里的综合教程中详细介绍了这一点 - http://serverless-stack.com/chapters/login-with-aws-cognito.html