IBM Cloud Docs
使用 IBM Cloudant 帐户

使用 IBM Cloudant 帐户

您的帐户是 IBM® Cloudant® for IBM Cloud® API 的入口点。 您可以使用地址前缀来访问帐户 https://$ACCOUNT.cloudant.com.

对于 IBM Cloudant 仪表板,您始终使用以下地址: https://$ACCOUNT.cloudant.com/dashboard.html

如果您还没有帐户,请登录 IBM Cloudant

要查看 IBM Cloudant 帐户是否可访问,请针对 https://$ACCOUNT.cloudant.com 创建 GET。 如果您错误地拼写了帐户名称,那么可能会发生以下错误: 503: 服务不可用。 您可以在以下列表中查看可用的认证类型:

IAM 认证

您可以使用 IAM 执行以下任务:

  • 集中管理 IBM Cloud中的访问管理。
  • 允许用户或服务使用同一套凭证(例如,相同的用户名和密码或 IAM API 密钥)访问许多不同的资源。
  • 可以授予 IAM API 密钥对帐户管理功能(例如,创建新数据库)的访问权。

有关更多信息,请参阅 管理访问权IAM概述。

认证

认证意味着证明您是谁。 通过提供用户凭证以进行验证来证明您的身份。

基本认证类似于在每次要输入时要检查的门上显示标识。 Cookie 认证类似于具有门的密钥,以便您可以随时随地让自己参与。 在 IBM Cloudant中,密钥是名为 AuthSession 的 cookie。

创建或使用性能关键型 IBM Cloudant 应用程序时,与基本认证相比,cookie 认证具有更多优势。 我们鼓励您尽可能使用 cookie 认证。

基本认证

要使用基本认证,请在每个请求中传递凭证。 您可以通过向请求添加 Authorization 头来传递凭证。

头包含认证方案 (Basic),后跟通过并置创建的字符串的 BASE64 编码:

  • 您的用户名
  • : 字符
  • 您的密码

实际上,许多用于创建 HTTP 请求的应用程序库可以为您执行此编码。

有关更多信息,请参阅有关基本认证的 安全方案

授权

认证后,下一个测试是决定是否允许您执行某些任务。 此决策称为授权。

向 IBM Cloudant 系统认证时,它会“知道”您的身份。 下一个问题是,您允许执行哪些任务?

您可以为 IBM Cloudant 系统的各个方面 (例如数据库或文档) 创建可执行的所有可能任务的完整列表。 这一方法虽然简单,但需要许多冗长的清单。 保持这些清单准确和完整是不切实际的。

更好的方法使用“角色”的想法。 可以将各种任务分组到某些通用角色的典型集合中。 例如,创建或删除数据库的任务是具有管理角色的人员的特征。 同样,创建或更新文档的任务是具有“编写”角色的人员的特征。

您将获得一个或多个角色,而不是明确列出您可以执行的每个任务。 如果您具有角色,那么可以执行与该角色关联的所有任务。

角色

以下部分仅适用于旧凭证。 有关将角色与 IAM 凭证配合使用的更多信息,请参阅 IBM Cloudant 角色

IBM Cloudant 具有许多可用的角色。 可以将角色分配给用户帐户或 API 密钥

下表定义了三个核心角色:

核心作用
角色 描述
_admin 更改安全设置,包括添加角色。
_reader 从数据库中读取文档。
_writer 在数据库中创建,更新和删除文档 (设计文档除外)。

_reader_writer 角色是互斥的。 如果用户具有 _writer 角色,那么他们无法读取自己创建的文档,除非他们 具有 _reader 角色。

您可能想要分配多个角色。 例如,用户可能需要对数据库中的文档进行读写操作,但不需要对数据库进行完全管理控制。 为满足此需求,将向用户的帐户授予 _reader_writer 角色,但不授予 _admin 角色。

还提供了一些“重点突出”的角色。 这些端点提供特定 API 端点的许可权。 重点角色许可权类似于核心角色许可权,但 应用于特定 API 端点。

下表定义了重点角色:

重点突出的角色
角色 描述 API 端点
_design 允许创建,读取,修改或删除对设计文档的访问权。 _design, _find, _index
_replicator 允许从数据库复制数据的读访问权和创建检查点的写访问权。 _local, _replicate, _replicator
_security 允许对 /$DATABASE/_security 端点进行读写访问。 _security

授予的访问权的性质取决于特定 API 端点。 例如, _design 角色提供允许用户或 API 密钥 创建,读取,修改或删除设计文档的访问权。 如果以此方式授予访问权,那么优点是无需分配更广泛适用的 _reader_writer 角色。 此区分很有用,因为否则授权帐户可能会读取或写入数据库中的文档 (设计文档除外)。

用于登录到仪表板的凭证自动具有您创建的所有数据库的 _admin 角色。 必须为每个人和所有其他用户 (包括与您共享数据库的用户) 以及您创建的 API 密钥显式地授予角色以执行相应任务。

特殊 nobody 用户名适用于尝试执行任务但未向系统认证的任何人或任何应用程序。 换言之, nobody 用户名适用于所有未经认证的连接尝试。 例如,如果应用程序尝试从数据库中读取数据,但未标识自身,那么仅当 nobody 用户具有角色 _reader 时,该任务才能继续执行。

可以向 认证的用户授予比向已认证的用户授予更强大的角色。 例如,如果有意授予 nobody 用户名 _admin_reader_writer 角色,但仅向已认证的用户帐户 (例如 alexone ) 授予 _reader 角色。 在这种情况下,未认证的用户可能比已认证的 alexone 用户具有更强大的角色。

了解 nobody 用户名 不是 提供一组缺省许可权的方法很重要。 而是使用 nobody 用户名来确定 未认证 用户的许可权。

确定要分配的角色

首先,确定要分配给用户帐户或 API 密钥的角色。 最好分配具有执行该帐户或 API 密钥的任务所必需的最少许可权的角色。

如果任务针对特定方面 (例如,使用设计文档或安全设置),请分配重点突出的角色,例如 _design_security

API 密钥

以下部分仅适用于旧凭证。 有关将 API 密钥与 IAM 凭证配合使用的更多信息,请参阅 IAM API 密钥

使用 API 密钥为人员或应用程序启用数据库访问,但不为该人员或应用程序创建新的 IBM Cloudant 帐户。 API 密钥是随机生成的用户名和密码。 该密钥将被授予数据库所需的访问许可权。

当生成密钥并授予必需的访问许可权时,可以使用 API 密钥的方式与普通用户帐户相同。

但是,API 密钥与普通用户帐户不同。 API 密钥无权访问仪表板。

API 密钥主要用于使应用程序能够访问具有确定的访问控制级别的数据库。

从 IBM Cloud® Public Germany 区域部署的所有 IBM Cloudant 实例都部署在欧盟管理的环境中。 任意 IBM Cloudant账户或 在欧盟管理环境之外生成的 API 密钥无法获准访问欧盟管理的 {{ite.data.keyword.cloudant_short_notm}} 实例。 访问欧盟管理的IBM Cloudant实例。 有关IBM Cloudant的更多信息 在欧盟管理的环境中,请参阅 位置和租赁

创建 API 密钥

不推荐使用先前通过向 https://cloudant.com/api/generate_api_key 端点发出 POST 命令来生成 API 密钥的方法。

您可以通过以下两种方式创建 API 密钥:

  1. 使用仪表板。
  2. 使用 IBM Cloudant API 来 修改许可权

无论您选择何种方法,都请记住记录密钥名称和密码。 这些值都是随机生成的,如果丢失或忘记,将无法检索。

使用 API 密钥

API 密钥通常通过使用至少具有一个数据库的帐户来生成。 可以将 API 密钥与其他数据库一起使用,甚至与其他帐户一起使用。

缺省情况下,API 密钥没有许可权。 必须显式地向其授予许可权。

生成 API 密钥后,通过向以下对象发送 PUT 请求,为特定数据库授予特定于密钥访问权的许可权: https://$ACCOUNT.cloudant.com/_api/v2/db/$DATABASE/_security.

数据库不必与最初用于生成 API 密钥的帐户位于同一帐户中。

要授予现有 API 密钥许可权以访问另一个帐户中的数据库,请执行以下步骤:

  1. 检索数据库的现有 安全许可权
  2. 将 API 密钥的详细信息 添加 到数据库安全许可权以及所需角色。

有关此过程的示例,请参阅博客文章: 使用具有多个 IBM Cloudant 数据库和帐户的 IBM Cloudant API 密钥。

删除 API 密钥

无法删除 API 密钥。 如果您知道 API 密钥及其密码,那么该密钥始终可供使用。 但是,仅当您将 API 密钥分配给数据库并分配用于处理数据库的许可权时,API 密钥才有用。

要“删除”API 密钥,请将其从数据库中除去。 然后,将除去先前分配给 API 密钥的用于处理该数据库的所有许可权。

使用控制面板删除 API 密钥

  1. 单击 Databases > Permissions
  2. 将鼠标悬停在要删除的 API 密钥上。
  3. 单击将鼠标悬停在 API 密钥上时显示的 "X"。

使用 IBM Cloudant API 除去 API 密钥

使用 修改许可权 方法从具有访问许可权的用户列表中除去 API 密钥。

此技术之所以有效,是因为 API 密钥与用户相似,并且被授予了访问许可权。 通过从具有访问许可权的用户列表中除去 API 密钥,可以从具有数据库访问权的用户列表中除去 API 密钥。

要除去 API 密钥,请将 HTTP PUT 请求发送到用于 创建 API 密钥的同一 _security API 端点。 此请求将从具有访问许可权的用户列表中除去 API 密钥。 提供具有访问许可权的用户名的更新列表。 更新后的列表不得包含 API 密钥。

_users 数据库与 IBM Cloudant 配合使用

以下部分仅适用于旧凭证。

您可以使用 _users 数据库,用于管理 IBM Cloudant中的角色。

必须对存储在 _users 数据库中的用户文档进行结构化和填充,以符合 Apache CouchDB 需求

您可以通过设置 couchdb_auth_only:true 参数来禁用 IBM Cloudant 授权检查。 要禁用 IBM Cloudant 安全性, PUT JSON 文档到数据库的 _security 端点。 例如, https://$ACCOUNT.cloudant.com/$DATABASE/_security

请参阅以下使用 HTTP 提交修改请求的示例:

PUT /$DATABASE/_security HTTP/1.1
Content-Type: application/json

请参阅以下示例以提交修改请求:

curl -H "Authorization: Bearer $API_BEARER_TOKEN" -X PUT "$SERVICE_URL/products/_security" -H "Content-Type: application/json" --data '{"members": {"names": ["user1", "user2"], "roles": ["developers"]}}'
import com.ibm.cloud.cloudant.v1.Cloudant;
import com.ibm.cloud.cloudant.v1.model.Ok;
import com.ibm.cloud.cloudant.v1.model.PutSecurityOptions;
import com.ibm.cloud.cloudant.v1.model.SecurityObject;

import java.util.Arrays;

Cloudant service = Cloudant.newInstance();

SecurityObject members = new SecurityObject.Builder()
    .names(Arrays.asList("user1", "user2"))
    .roles(Arrays.asList("developers"))
    .build();

PutSecurityOptions securityOptions =
    new PutSecurityOptions.Builder()
        .db("products")
        .members(members)
        .build();

Ok response =
    service.putSecurity(securityOptions).execute()
        .getResult();

System.out.println(response);
const { CloudantV1 } = require('@ibm-cloud/cloudant');

const service = CloudantV1.newInstance({});

const members: CloudantV1.SecurityObject = {
  names: ['user1', 'user2'],
  roles: ['developers']
};

service.putSecurity({
  db: 'products',
  members: members
}).then(response => {
  console.log(response.result);
});
from ibmcloudant.cloudant_v1 import CloudantV1, SecurityObject

service = CloudantV1.new_instance()

members = SecurityObject(
  names=['user1', 'user2'],
  roles=['developers']
)

response = service.put_security(
  db='products',
  members=members
).get_result()

print(response)
putSecurityOptions := service.NewPutSecurityOptions(
  "products",
)
putSecurityOptions.SetMembers(&cloudantv1.SecurityObject{
  Names: []string{"user1", "user2"},
  Roles: []string{"developers"},
})

ok, response, err := service.PutSecurity(putSecurityOptions)
if err != nil {
  panic(err)
}

b, _ := json.MarshalIndent(ok, "", "  ")
fmt.Println(string(b))

先前的 Go 示例需要以下导入块:

import (
   "encoding/json"
   "fmt"
   "github.com/IBM/cloudant-go-sdk/cloudantv1"
)

所有 Go 示例都需要初始化 service 对象。 有关更多信息,请参阅 API 文档的 认证部分 以获取示例。

请参阅 JSON 格式的以下示例修改请求:

{
	"couchdb_auth_only": true,
	"members": {
		"names": ["member"],"roles":[]
	},
	"admins": {
		"names": ["admin"],"roles":[]
	}
}

请参阅来自修改请求的以下示例响应:

{
	"ok" : true
}