云套件.js的安全性

4

我阅读了苹果公司提供的示例(CloudKit目录),发现每次写入或读取数据时都需要将API token放入脚本中。

现在Javascript是客户端基础,这意味着每个用户都可以读取API token并读写我的容器?!

这段代码将会在一个Javascript文件中。

CloudKit.configure({
locale: 'en-us',

containers: [{

// Change this to a container identifier you own.
containerIdentifier: 'com.example.apple-samplecode.cloudkit-catalog',

apiTokenAuth: {
  // And generate a web token through CloudKit Dashboard.
  apiToken: '<insert your token here>',

  persist: true, // Sets a cookie.

  signInButton: {
    id: 'apple-sign-in-button',
    theme: 'black' // Other options: 'white', 'white-with-outline'.
  },

  signOutButton: {
    id: 'apple-sign-out-button',
    theme: 'black'
  }
},

environment: 'development'
}]
});

现在的问题是:我是否遗漏了什么或者解决方案是使用Node进行服务器到服务器通信?

1
这个配置将在服务器端运行,使用 nodeJS 服务器。这意味着Javascript不是客户端的。 - Pogrindis
@Pogrindis 好的,谢谢。你确认了我的担忧。 - ph1psG
2个回答

5
这是我的理解: API令牌并不是真正意义上的私密信息,因为它们被设计用于客户端JavaScript。即使你试图在代码中混淆令牌,通过检查登录过程中调用的URL,令牌很容易被发现。
重要的是要了解它们本身并不能做太多事情。它们允许用户登录到您的容器中,然后已登录的用户可以读取和写入他们自己的数据-如果他们在iPhone或Mac上登录iCloud并在那里使用您的应用程序,他们将拥有同样的访问权限。
这并不是一个安全问题,因为即使他们获取了你的令牌并编写了自己的JavaScript,他们只是在操纵自己的数据。尽管如此,您可以使用“允许的来源”选项来增加难度。(我这么说是因为他们可能会使用浏览器扩展或其他方式来更改您网站上的JS。总的来说,即使从API返回,将用户的CloudKit数据视为不可信也似乎是明智的。) 服务器对服务器密钥则非常不同,并且具有私钥,当然应该是私密的。在这种情况下,任何拥有私钥的人都可以读取和写入您的公共数据库。正如名称所示,这不是您会直接从JavaScript使用的东西-您将编写自己的服务器端代码,直接联系CloudKit API。
不幸的是,尽管苹果在创建私人服务器对服务器密钥时有一个很好的红色警告,但他们似乎没有提供有关API令牌的任何安全指导。我有99%的信心这是因为这不是一个问题,并正在努力获得最后1%的确认。

1

init.js在客户端浏览器中运行,您可以从代码中轻松地注意到这一点:

<script>
        window.addEventListener('cloudkitloaded',CKCatalog.init);
</script>

这将向用户公开API令牌...
但您始终可以通过以下方式减轻API令牌的危险使用风险:
  • 将API令牌的"允许来源"设置为您网站的域名;
  • 将"登录回调"设置为您的URL;
  • 等等
简而言之,客户端运行将披露您的API令牌,但如果您采取措施防止令牌被危险使用,那么仍然是安全的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接