配置跨源资源共享 (CORS)

适用范围: NoSQL

跨源资源共享 (CORS) 是一项 HTTP 功能,使在一个域中运行的 Web 应用程序能够访问另一个域中的资源。 Web 浏览器实施一种称为“同源策略”的安全限制,防止网页调用不同域中的 API。 但是,CORS 提供了一种安全的方式,允许源域调用另一个域中的 API。 Azure Cosmos DB 中的 API for NoSQL 现在通过使用“allowedOrigins”标头来支持跨域资源共享 (CORS)。 为 Azure Cosmos DB 帐户启用 CORS 支持后,仅对经过身份验证的请求进行评估,以根据指定的规则确定是否允许这些请求。

可以使用 Azure 门户或 Azure 资源管理器模板配置跨源资源共享 (CORS) 设置。 对于使用 API for NoSQL 的 Azure Cosmos DB 帐户,Azure Cosmos DB 支持在 Node.js 和基于浏览器的环境中均可使用的 JavaScript 库。 使用网关模式时,该库现在可以充分利用 CORS 支持。 无需客户端配置即可使用此功能。 借助 CORS 支持,来自浏览器的资源可以通过 JavaScript 库直接访问 Azure Cosmos DB 或直接通过 REST API 进行访问来执行简单操作。

注意

CORS 支持仅适用于 Azure Cosmos DB for NoSQL 并受其支持。 它不适用于用于 Cassandra、Gremlin 或 MongoDB 的 Azure Cosmos DB API,因为这些协议不使用 HTTP 进行客户端-服务器通信。

通过 Azure 门户启用 CORS 支持

遵循以下步骤通过 Azure 门户启用跨源资源共享:

  1. 导航到 Azure Cosmos DB 帐户。 打开“CORS”页。

  2. 指定可以对 Azure Cosmos DB 帐户执行跨源调用的源的逗号分隔列表。 例如:https://www.mydomain.comhttps://mydomain.comhttps://api.mydomain.com。 还可以使用通配符“*”允许所有源,然后选择“提交”。

    注意

    目前,不能将通配符用作域名的一部分。 例如,尚不支持 https://*.mydomain.net 格式。

    Enable cross origin resource sharing using Azure portal

使用资源管理器模板启用 CORS 支持

若要使用资源管理器模板启用 CORS,请将具有“allowedOrigins”属性的“cors”部分添加到任何现有模板。 该 JSON 是一个模板示例,该模板创建了一个启用 CORS 的新 Azure Cosmos DB 帐户。

{
  "type": "Microsoft.DocumentDB/databaseAccounts",
  "name": "[variables('accountName')]",
  "apiVersion": "2019-08-01",
  "location": "[parameters('location')]",
  "kind": "GlobalDocumentDB",
  "properties": {
    "consistencyPolicy": "[variables('consistencyPolicy')[parameters('defaultConsistencyLevel')]]",
    "locations": "[variables('locations')]",
    "databaseAccountOfferType": "Standard",
    "cors": [
      {
        "allowedOrigins": "https://contoso.com"
      }
    ]
  }
}

从浏览器使用 Azure Cosmos DB JavaScript 库

目前,Azure Cosmos DB JavaScript 库只有 CommonJS 版本的库(随附其包)。 若要从浏览器使用此库,必须使用 Rollup 或 Webpack 等工具来创建与浏览器兼容的库。 某些 Node.js 库应具有它们的浏览器模拟。 这是具有所需模拟设置的 webpack 配置文件的示例。

const path = require("path");

module.exports = {
  entry: "./src/index.ts",
  devtool: "inline-source-map",
  node: {
    net: "mock",
    tls: "mock"
  },
  output: {
    filename: "bundle.js",
    path: path.resolve(__dirname, "dist")
  }
};

下面是一个使用 TypeScript 和 Webpack 与 Azure Cosmos DB JavaScript SDK 库的代码示例。 该示例生成一个 Todo 应用,用于在创建新项时发送实时更新。

最佳做法是,不要使用主键从浏览器与 Azure Cosmos DB 进行通信。 而应使用资源令牌进行通信。 有关资源令牌的详细信息,请参阅保护对 Azure Cosmos DB 的访问一文。

后续步骤

若要了解有关保护 Azure Cosmos DB 帐户的其他方式,请参阅以下文章: