DID Javascript SDK 简介

接口能力

接口类型 接口名称 接口能力简要描述
DID 管理 创建 DID 为用户创建一个 DID并上链存储
恢复 DID 根据助记词恢复 DID信息,需要 DID 已在链上注册
删除 DID 删除自己创建的 DID
解析 DID 通过 Resolver解析器获取DID Document
重置 DID 密钥 重置DID 的公私钥,并在链上更新 DID Document
更新 DID 服务列表 更新 DID Document中的 Service,并上链
加密数据 使用 DID 的公钥加密数据
解密数据 使用 DID 的私钥解密数据
声明管理 注册发证方 向注册中心注册发证方
删除发证方 发证方从注册中心将自己删除
获取发证方列表 向注册中心查询有哪些发证方
签发声明 发证方向申请者签发声明
申请声明 用户向发证方申请声明
获取声明签发结果 用户查询声明申请结果
验证声明 第三方验证声明的有效性
数据加密存储管理 获取 Identity hub 的 DID 根据 Identity hub 的服务地址查询 hub 的 DID
添加 Identity hub 用户 DID 使用某个 Identity hub 进行数据存储,并更新 DID Document 的 Service 服务列表
删除 Identity hub 用户 DID 不再使用某个 Identity hub 进行数据存储,并更新 DID Document 的 Service 服务列表
将数据存入 Identity hub 用户将数据存入 Identity hub,返回 dataID
删除 Identity hub中的数据 用户根据 dataID 删除自己存储在 hub 中的某个数据
更新数据 更新hub 中存储的数据
查询 Identity hub 中存储的数据列表 返回存储数据元信息列表,列表中包含 dataID,可通过 dataID 查询具体的数据信息
获取 Identity hub 中存储的数据 根据 dataID 查询hub 中存储的数据,用户只能查询自己的数据
获取历史版本的数据 数据更新后,可以获取 hub 中存储的历史版本数据
将数据分享给第三方 DID 用户 DID 为第三方 DID 创建数据的授权
查询所有创建的授权 查询已创建的所有授权信息
上传已有授权 将本地已有的授权信息上传到 hub 中
查询创建的授权 用户查询自己创建的授权
删除创建的授权 用户删除自己创建的授权

快速入门

安装

SDK目录结构

├── lib
│  ├── hdwallet                                 // 钱包相关
│  ├── resolver                                 // DID 解析器
│  ├── claim                                    // 声明管理类
│  └── util                                     // 工具类
├── DIDClient.js                                // DID sdk交互类
├── index.js                                    // 入口文件
└── package.json                                // npm包描述文件

直接使用npm安装

npm install @baidu/did-sdk-javascript

Identity hub 的操作依赖

@baidu/did-identity-hub

创建 DIDClient

用户可以参考以下代码创建 DIDClient

const DIDClient = require('@baidu/did-sdk-javascript');

let option = {
    resolverUrl: 'https://did.baidu.com',
    registryUrl: 'https://did.baidu.com',
    hubUrl: 'https://did.baidu.com/v1/identity-hub',
    fetch: 'your fetch implementation'
};

let didClient = new DIDClient(option);

  • resolverUrl:DID resolver 解析器的地址,默认值为 "https://did.baidu.com"
  • registryUrl:Issuer 注册中心地址,默认值为 "https://did.baidu.com"
  • hubUrl:Identity hub 服务地址,默认值为 "https://did.baidu.com/v1/identity-hub"
  • fetch:fetch 实现,默认采用cross-fetch,兼容浏览器和 Node.js,但是对于小程序端,需要自行封装 fetch

option 中的参数都是可选的,用户也可以全都是用默认值,用最简单的方式创建 DIDClient


let didClient = new DIDClient();

接口说明

DID 管理

创建 DID

为用户创建一个 DID并上链存储。


let useMnemonic = true;
let result = await didClient.createDID(useMnemonic);

DID 上链是一个异步过程,后续需要用解析接口来查询 DID Document,如果查询到了,说明 DID 创建成功且已经上链。

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | ----------- | ---- | ---- | --------------------------- | | useMnemonic | 否 | bool | 是否生成助记词,默认为 true |

创建 DID 分为两种模式,由参数 useMnemonic来控制,第一种返回 DID 的私钥,第二种返回 DID 的助记词和 path,通过助记词和 path 可以重新生成DID 及其私钥。

返回数据参数详情

字段 必选 类型 说明
did string 生成的 DID
privKey string DID 的主私钥
recoveryPrivKey string DID 的备私钥
字段 必选 类型 说明
did string 生成的 DID
mnemonic string 助记词
path Array 密钥 path

使用 DID 时,一般需要提供 DID 的私钥进行签名等操作,而基于以上的两种模式,后续接口操作可以使用以下两种结构中的一种来提供 DID 信息:

let didInfo = {
    did: 'your DID',
    privKey: 'main private key',
    recoveryPrivKey: 'recovery private key'
}

let didInfo = {
    mnemonic: 'your mnemonic',
    path: []
}

返回示例

{
    "did": "did:ccp:4QKph2QNjLt25pPnRKm9g3DANQRM",
    "mnemonic": "raise miracle quarter gun never story tone fortune ethics wage return tape among exist client envelope volcano cycle bonus ticket reward glance car else",
    "path": [
      "m/0",
      "m/1"
    ]
}

{
    "did": "did:ccp:4EGrAaPYcV5kH7eV6C7eK22rF2yB",
    "privKey": "440138fe737ab9d56dd43224edf3d25f17351a8b55a5b0329bb1e7f8adb23ba3",
    "recoveryPrivKey": "5f0c46dc40018dc6494ecd210280e9081b9075334008e7ca1b5e872b094a1d3a"
}

恢复 DID

通过助记词恢复已经创建的 DID。


let result = didClient.recoverDID(mnemonic, path);

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | -------- | ---- | ------------- | --------- | | mnemonic | 是 | string | 助记词 | | path | 是 | Array | 密钥 path |

返回数据参数详情 | 字段 | 必选 | 类型 | 说明 | | --------------- | ---- | ------ | ------------ | | did | 是 | string | 生成的 DID | | privKey | 是 | string | DID 的主私钥 | | recoveryPrivKey | 是 | string | DID 的备私钥 | | didDocument | 是 | Object | DID Document |

返回示例

{
  "did": "did:ccp:4QKph2QNjLt25pPnRKm9g3DANQRM",
  "privKey": "31e95eb1b462ffe20b9f05724cdd92c56dfe4b0be66b1537c385618d9c1b52fc",
  "recoveryPrivKey": "ba3f61a7568b63563fe206fed1d55de80f92c4cf74536736841277deee923d18",
  "didDocument": {
    "@context": "https://w3id.org/did/v1",
    "id": "did:ccp:4QKph2QNjLt25pPnRKm9g3DANQRM",
    "version": 1,
    "created": "2020-01-23T06:20:41.790Z",
    "updated": "2020-01-23T06:20:41.790Z",
    "publicKey": [
      {
        "id": "did:ccp:4QKph2QNjLt25pPnRKm9g3DANQRM#keys-1",
        "type": "Secp256k1",
        "publicKeyHex": "0415bdf057dc266964cb7e3e5c4a49ba863e7b3e389a906befc9b912e531f70150dedf99b5365063d70896023c814cc5a05d3b8785fe9e1b78fd5581d9c5d54e08"
      },
      {
        "id": "did:ccp:4QKph2QNjLt25pPnRKm9g3DANQRM#keys-2",
        "type": "Secp256k1",
        "publicKeyHex": "045c6d04b499b010bcba99372fdf261856e03326a2af537c452a51eedb26cadfef431f91236ce2bba4c9a3294a4294687a74ba0fa2a531451953a7d358880b178c"
      }
    ],
    "authentication": [
      "did:ccp:4QKph2QNjLt25pPnRKm9g3DANQRM#keys-1"
    ],
    "recovery": [
      "did:ccp:4QKph2QNjLt25pPnRKm9g3DANQRM#keys-2"
    ],
    "service": [
      {
        "id": "did:ccp:4QKph2QNjLt25pPnRKm9g3DANQRM#resolver",
        "type": "DIDResolve",
        "serviceEndpoint": "https://did.baidu.com"
      }
    ],
    "proof": {
      "type": "Secp256k1",
      "creator": "did:ccp:4QKph2QNjLt25pPnRKm9g3DANQRM#keys-1",
      "signatureValue": "304402204767b856a83e55c81937f0cde6b75c013e7db26143de6aac3b946a4f94706bda02200c761abdfe3e95699b42e21d90a6bcf62587f7f60d7b91b87d7cc850263d867c"
    }
  }
}

删除 DID

删除一个已上链的 DID,只有 DID 的 owner 才能删除。


let result = await didClient.deleteDID(didInfo);

删除后可以通过解析接口来查看,如果返回 "revoked did",说明该 DID 已在链上注销。

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | ------- | ---- | ------ | ---------------- | | didInfo | 是 | object | 要删除的 did信息 |

返回数据参数详情 | 字段 | 必选 | 类型 | 说明 | | ---- | ---- | ------ | ---------- | | | 是 | string | 删除的 did |

解析 DID

解析一个 DID,从链上获取 DID Document。


let result  = await didClient.ResolveDID(did, versionId);

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | --------- | ---- | ------ | --------------------------------- | | did | 是 | string | 要解析的 DID | | versionId | 否 | string | DID Document 的版本,默认为最新版 |

返回数据参数详情 | 字段 | 必选 | 类型 | 说明 | | ----------- | ---- | ------ | ------------ | | didDocument | 是 | object | DID Document |

返回示例

{
  "@context": "https://w3id.org/did/v1",
  "id": "did:ccp:4QKph2QNjLt25pPnRKm9g3DANQRM",
  "version": 2,
  "created": "2020-01-23T06:20:41.790Z",
  "updated": "2020-01-23T06:21:01.563Z",
  "publicKey": [
    {
      "id": "did:ccp:4QKph2QNjLt25pPnRKm9g3DANQRM#keys-1",
      "type": "Secp256k1",
      "publicKeyHex": "048c5c24f7d115c25be5b311e85a54da565f49bbb5fdef0be2531f2ace93dbcb2b8b725c683d42de3e71ee8be12f78263c565f579cf7c090eeb76c990408ba991f"
    },
    {
      "id": "did:ccp:4QKph2QNjLt25pPnRKm9g3DANQRM#keys-2",
      "type": "Secp256k1",
      "publicKeyHex": "0400f60f5b0813a1cc651242a5f612292ae39fa7061fae536bd34a03cadab579bac0ab98feb1f8182070f4d08dff644fb57581485d2ede1384dbc52a8d1a35f99b"
    }
  ],
  "authentication": [
    "did:ccp:4QKph2QNjLt25pPnRKm9g3DANQRM#keys-1"
  ],
  "recovery": [
    "did:ccp:4QKph2QNjLt25pPnRKm9g3DANQRM#keys-2"
  ],
  "service": [
    {
      "id": "did:ccp:4QKph2QNjLt25pPnRKm9g3DANQRM#resolver",
      "type": "DIDResolve",
      "serviceEndpoint": "https://did.baidu.com"
    }
  ],
  "proof": {
    "type": "Secp256k1",
    "creator": "did:ccp:4QKph2QNjLt25pPnRKm9g3DANQRM#keys-1",
    "signatureValue": "304402201595db3a7a2ec1f6209df460e312bd02a359730f0a5551d8768348d08cc6517b022016b3b6a434ebbb40412fea2cb9108de0ec3025c586ea2b6c47d984e7f3893887"
  }
}

重置 DID 密钥

重置 DID 的主备密钥,并在链上更新 DID Document,只有 DID 的 owner 才能重置自己的密钥。


let result = await didClient.resetKey(didInfo);

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | ------- | ---- | ------ | ------- | | didInfo | 是 | object | did信息 |

返回数据参数详情

字段 必选 类型 说明
did string 重置后的 DID
privKey string 更新后的DID 的主私钥
recoveryPrivKey string 更新后的DID 的备私钥
字段 必选 类型 说明
did string 重置后的 DID
mnemonic string 助记词
path Array 更新后的密钥 path

返回示例

{
  "did": "did:ccp:4QKph2QNjLt25pPnRKm9g3DANQRM",
  "mnemonic": "raise miracle quarter gun never story tone fortune ethics wage return tape among exist client envelope volcano cycle bonus ticket reward glance car else",
  "path": [
    "m/2",
    "m/3"
  ]
}

{
  "did": "did:ccp:4EGrAaPYcV5kH7eV6C7eK22rF2yB",
  "privKey": "60e2216509ae01189f053c6ca7d625cf08d58cadc699a616cd8ffa67ee256364",
  "recoveryPrivKey": "55070a189f7d583f1848dc5eca67e9d86a4a498e88881559a72e2597318934a8"
}

更新 DID 服务列表

更新 DID Document 的服务列表信息,只有DID 的 owner 才能更新自己的 DID Document。


let result = await didClient.updateService(didInfo, serviceList);

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | ----------- | ---- | ------------- | ----------------- | | didInfo | 是 | object | did信息 | | serviceList | 是 | Array | 新的 Service 信息 |

返回数据参数详情

字段 必选 类型 说明
did string 更新后的 DID
didDocument object 更新后的DID Document

返回示例

{
  "did": "did:ccp:4EGrAaPYcV5kH7eV6C7eK22rF2yB",
  "didDocument": {
    "@context": "https://w3id.org/did/v1",
    "id": "did:ccp:4EGrAaPYcV5kH7eV6C7eK22rF2yB",
    "version": 3,
    "created": "2020-01-23T06:20:51.630Z",
    "updated": "2020-01-23T06:21:21.595Z",
    "publicKey": [
        {
        "id": "did:ccp:4EGrAaPYcV5kH7eV6C7eK22rF2yB#keys-1",
        "type": "Secp256k1",
        "publicKeyHex": "04d232cc663badc4d2593a03ea0356969abb2c2cb25f852b2f5b568c28ce3fb7acd60ed79e706d83d5184b101fe649878b28734aa7571e83414d29afd3f1191568"
        },
        {
        "id": "did:ccp:4EGrAaPYcV5kH7eV6C7eK22rF2yB#keys-2",
        "type": "Secp256k1",
        "publicKeyHex": "047d51938847c8a1242dd3afd41adf8572c3e88a2d6ed5766e43270ec9c1807e01aa2e068d32a315a793af135b9176504674895800ee382d42e358d20099c52283"
        }
    ],
    "authentication": [
        "did:ccp:4EGrAaPYcV5kH7eV6C7eK22rF2yB#keys-1"
    ],
    "recovery": [
        "did:ccp:4EGrAaPYcV5kH7eV6C7eK22rF2yB#keys-2"
    ],
    "service": [
        {
        "id": "did:ccp:4EGrAaPYcV5kH7eV6C7eK22rF2yB#resolver",
        "type": "DIDResolve",
        "serviceEndpoint": "https://did.baidu.com"
        },
        {
        "id": "did:ccp:4EGrAaPYcV5kH7eV6C7eK22rF2yB#test",
        "type": "did-test",
        "serviceEndpoint": "https://did-test.com"
        }
    ],
    "proof": {
        "type": "Secp256k1",
        "creator": "did:ccp:4EGrAaPYcV5kH7eV6C7eK22rF2yB#keys-1",
        "signatureValue": "3045022100a4479752721b88d4be3f66f819ba4995eec2e86b2346ee082591f01315632820022032248b4d17cf33824a30a313e556eebd9f66feb0796417a04df089609c53395a"
    }
  }
}

加密数据

使用 DID 的主公钥加密数据,加密时先生成一个对称密钥加密数据(对称加密),然后用 DID 的公钥加密对称密钥(非对称加密)。


let result = didClient.encrypt(didInfo, data);

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | ------- | ---- | ------ | ---------------- | | didInfo | 是 | object | did信息 | | data | 是 | string | 待加密的数据原文 |

client 会解析 did,获取主公钥(#keys-1对应的公钥)来加密数据。

返回数据参数详情

字段 必选 类型 说明
cipher string 加密后的数据密文
key string 加密后的密钥密文

返回示例


{
  "key": "04f50fb4e2e6d41d0108cfb73fabf0770575d6d014bc8d0ded3c4202f546d66372aa528ffe3088320cc2982bd9e07b53119c7f3ecb73f5f4e314b7f82aa625c4dc0409467705c4d977103e3088d737f2cb06de1e5f28a3eacfe23f3245564bc40decec40448d6b451570319cb8dbb98c4ff8e176330af2cfa2ea0281e941f518e15004577e9e037aa027700e9e56021f13f015bbe312eb8dd0668caad7e01bde9cef",
  "cipher": "Vy4VLvo1QmQsdRRuV+qEtA=="
}

解密数据

使用 DID 的私钥解密数据。


let result = didClient.decrypt(didInfo, encryptObj);

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | ---------- | ---- | ------ | ------------------------ | | didInfo | 是 | object | did信息 | | encryptObj | 是 | object | 加密的数据密文和密钥密文 |

返回数据参数详情

字段 必选 类型 说明
string 解密后的原文

声明管理

注册发证方

发证方向注册中心注册。


let didInfo = {
    did: 'did:ccp:xxx',
    privKey: 'your private key'
}

let provideData = {
    Name: 'lilei',
    MobilePhone: '13088888888',
    ClaimType: 'RealNameAuthentication'
}
let result = await didClient.addIssuer(didInfo, provideData);

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | ----------- | ---- | ------ | ----------- | | didInfo | 是 | object | did及其私钥 | | provideData | 是 | string | 注册信息 |

返回数据参数详情

字段 必选 类型 说明
string issuer uuid

返回示例


"fc16ad2d-6d03-4903-a509-efd1f4db3d14"

删除发证方

发证方在注册中心中将自己删除


let didInfo = {
    did: 'did:ccp:xxx',
    privKey: 'your private key'
}

let result = await didClient.deleteIssuer(didInfo, issuerUuid);

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | ---------- | ---- | ------ | ----------- | | didInfo | 是 | object | did及其私钥 | | issuerUuid | 是 | string | issuer uuid |

返回数据参数详情

字段 必选 类型 说明
string 被删除的issuer uuid

返回示例


"fc16ad2d-6d03-4903-a509-efd1f4db3d14"

获取发证方列表

想注册中心查询发证方列表


let result = await didClient.getIssuers();

返回数据参数详情

字段 必选 类型 说明
Array issuer的具体信息
id number issuer的序号
uuid string issuer的uuid
website string issuer的website
endpoint string issuer的服务地址
shortDescription string issuer的短描述
longDescription string issuer的长描述
serviceType string issuer提供的认证类型
requestData string 需要向 issuer 提供的信息
deleted string issuer是否被删除
createTime string issuer的创建时间
updateTime string issuer的更新时间

返回示例

[
    {
        "id": 3,
        "uuid": "407ab47f-1f7e-4a8c-86b0-e5c12dddf87d",
        "did": "did:ccp:ceNobbK6Me9F5zwyE3MKY88QZLw",
        "website": "https://cloud.baidu.com/solution/digitalIdentity.html",
        "endpoint": "https://did.baidu.com",
        "shortDescription": "XXX实名认证声明",
        "longDescription": "XXX实名认证声明",
        "serviceType": "RealNameAuthentication",
        "requestData": {
            "basicData": [
                "Name",
                "MobilePhone"
            ]
        },
        "deleted": false,
        "createTime": "2019-10-14T13:33:05+08:00",
        "updateTime": "2019-10-14T13:33:05+08:00"
    }
]

签发声明

Issuer 用自己的 did 签发 claim。


let didInfo = {
    did: 'did:ccp:xxx',
    privKey: 'your private key'
}

let rawClaim = {
    "type": [
      "ProofClaim"
    ],
    "expirationDate": "2017-04-01T12:01:20Z",
    "credentialSubject": {
        "id": "did:ccp:ceNobbK6Me9F5zwyE3MKY88QZLw",
        "shortDescription": "实名认证声明",
        "longDescription": "该用户经过了我司的实名认证",
        "type": "RealNameAuthentication"
    },
    "revocation": {
        "id": "https://example.com/v1/claim/revocations",
        "type": "SimpleRevocationListV1"
    }
}
let result = await didClient.issueClaim(didInfo, rawClaim);

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | -------- | ---- | ------ | ----------------- | | didInfo | 是 | object | did及其私钥 | | rawClaim | 是 | object | 签发的 claim 原文 |

对于 rawClaim,其参数信息如下: - type:claim所属大类的类型,目前仅支持ProofClaim - expirationDate:claim过期时间,格式:2017-04-01T12:01:20Z - credentialSubject:签发的内容,其中id是目标did,shortDescriptionlongDescription分别是长短描述,type是claim的类型。 - revocation:claim的吊销相关信息

claim 支持如下类型:

  • RealNameAuthentication:实名认证
  • FingerprintAuthentication:指纹认证
  • EnterpriseAuthentication:企业认证
  • BusinessAuthentication:商户认证
  • VIPAuthentication:大客户认证

claim的详细说明见:http://did.baidu.com/verifiable-claim/

返回数据参数详情

字段 必选 类型 说明
@context Array schema规范
id string claim的 id
type Array claim 的类型
issuer string claim 签发者
issuanceDate string 签发日期
expirationDate string 有效日期
credentialSubject object 声明的具体内容
revocation object 声明吊销相关信息
proof object issuer 提供的签名认证

返回示例

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1"
  ],
  "id": "ee1b680a-a9cb-4e93-b0be-5b356d9a1ffd",
  "type": [
    "ProofClaim"
  ],
  "issuer": "did:ccp:2i75GQt23HwSs9Qq3X2Tr4jr8RQB",
  "issuanceDate": "2020-02-11T11:03:35.223Z",
  "expirationDate": "2088-04-01T12:01:20Z",
  "credentialSubject": {
    "id": "did:ccp:rGiR2khCfp8fxFf2Ss2eKnAbfhb",
    "shortDescription": "实名认证声明",
    "longDescription": "该用户经过了我司的实名认证",
    "type": "RealNameAuthentication"
  },
  "revocation": {
    "id": "https://example.com/v1/claim/revocations",
    "type": "SimpleRevocationListV1"
  },
  "proof": {
    "type": "Secp256k1",
    "creator": "did:ccp:2i75GQt23HwSs9Qq3X2Tr4jr8RQB/1",
    "signatureValue": "3045022100ca443e49dc61af9b5e9f0bee5df30660c3d9e714a1543b4d0035907a0628d91a02200ef43b67f79d5da8366882d7fadef07a704f92295d6813dff50b7fb8dc9285b8"
  }
}

申请声明

用户向 issuer 申请声明


let didInfo = {
    did: 'did:ccp:xxx',
    privKey: 'your private key'
}

let provideData = {
  "provideData": {
      "Name": "lilei",
      "MobilePhone": "13088888888",
      "ClaimType": "RealNameAuthentication"
  }
}
let result = await didClient.applyClaim(didInfo, issuerEndpoint, provideData);

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | -------------- | ---- | ------ | -------------------- | | didInfo | 是 | object | did及其私钥 | | issuerEndpoint | 是 | string | issuer 的服务地址 | | provideData | 是 | object | 向 issuer 提供的数据 |

返回数据参数详情

字段 必选 类型 说明
string 申请 ID, applyId

返回示例


"c71f883b-b3dd-4851-8110-e94b32bef91d"

获取声明签发结果

查询声明的申请结果。


let didInfo = {
    did: 'did:ccp:xxx',
    privKey: 'your private key'
}

let result = await didClient.getApplyResult(didInfo, applyId);

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | ------- | ---- | ------ | ----------- | | didInfo | 是 | object | did及其私钥 | | applyId | 是 | string | 申请 id |

返回数据参数详情

字段 必选 类型 说明
status string 声明的处理状态,有 Doing, Done, Failed 三种状态
claim object 如果声明已受理,则为声明的具体信息

返回示例

{
  "claim": {
    "@context": [
      "https://www.w3.org/2018/credentials/v1"
    ],
    "id": "0e485024-fe3f-4a59-ac80-bcc243ea4840",
    "type": [
      "ProofClaim"
    ],
    "issuer": "did:ccp:4j6AoeMcX6NQMJ5MibnR2stWHZ6",
    "issuanceDate": "2020-02-12T13:23:16Z",
    "expirationDate": "2066-01-02T15:04:05.999Z",
    "credentialSubject": {
      "id": "did:ccp:2K7GBS7bbWwbFZH9XnADhSfuf3Cr",
      "shortDescription": "实名认证",
      "longDescription": "本DID已通过实名认证。",
      "type": "RealNameAuthentication"
    },
    "revocation": {
      "id": "https://did.baidu.com/v1/claim/revocations",
      "type": "SimpleRevocationListV1"
    },
    "proof": [
      {
        "type": "Secp256k1",
        "creator": "did:ccp:4j6AoeMcX6NQMJ5MibnR2stWHZ6/1",
        "signatureValue": "3045022100f97b986d13e767cc0461f7d88520c87aedff4b4fbcc5edd05e19aa15098685f70220503d4da0c05864af2acc74047d0e679b7d8da19384c5c3b52ee3302fb1c8a2b4"
      }
    ]
  },
  "status": "Done"
}

验证声明

验证声明的有效性,任何人都可以验证。


let result = await didClient.verifyClaim(claim);

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | ----- | ---- | ------ | --------- | | claim | 是 | object | claim数据 |

返回数据参数详情

字段 必选 类型 说明
bool 验证结果

数据加密存储管理

获取 Identity hub 的 DID

向 Identity hub 的 endpoint 查询 hubDid。


let result = await didClient.getHubDid(hubUrl);

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | ------ | ---- | ------ | ------------- | | hubUrl | 是 | string | hub的服务地址 |

返回数据参数详情

字段 必选 类型 说明
string hub did

返回示例

'did:ccp:4XF8B3KS7NBp3KhqjZZyBRow2pUu'

注册 HubDID

注册一个hub did,其 DID Document 中包含特定的服务信息。


let result = await didClient.registerHubDid(endpoint);

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | -------- | ---- | ------ | ------------- | | endpoint | 是 | string | hub的服务地址 |

返回数据参数详情

字段 必选 类型 说明
did string 生成的 DID
privKey string DID 的主私钥
recoveryPrivKey string DID 的备私钥

返回示例

{
  "did": "did:ccp:3i9BLRUqGGfeuJ9Esjfw3RWYug4y",
  "privKey": "b99e8a4cea18e700c7ffe9e0efa4889b974aecc340bae99cdc90f0cb282a6668",
  "recoveryPrivKey": "fc48306d1e5e2e51038fb25a2cb6a841fdbbfd8c8acd7d41e7b4509322d3ff04"
}

hubDID 的 DID Document 中的 Service 字段标明了其所提供的 hub 服务

{
  "@context": "https://w3id.org/did/v1",
  "id": "did:ccp:3i9BLRUqGGfeuJ9Esjfw3RWYug4y",
  "version": 2,
  "created": "2020-02-02T14:05:38.894Z",
  "updated": "2020-02-02T14:05:46.209Z",
  "publicKey": [
    {
      "id": "did:ccp:3i9BLRUqGGfeuJ9Esjfw3RWYug4y#keys-1",
      "type": "Secp256k1",
      "publicKeyHex": "04e3158bf954a86f9dc6012caf67ef67059b9a1a70cedbd1f4a3daddd124a50afed383c18a442c681097eee35d754704e921e093bcb5eff33bba0664430b78ec95"
    },
    {
      "id": "did:ccp:3i9BLRUqGGfeuJ9Esjfw3RWYug4y#keys-2",
      "type": "Secp256k1",
      "publicKeyHex": "047886c5c389948d92ebc99ca2b4a6ffbfa96e848b06271df6ae822b2287fb6c1780865dcb51af311b883c9a81e36dda3b993b532f6984d5a740f48666b246efa1"
    }
  ],
  "authentication": [
    "did:ccp:3i9BLRUqGGfeuJ9Esjfw3RWYug4y#keys-1"
  ],
  "recovery": [
    "did:ccp:3i9BLRUqGGfeuJ9Esjfw3RWYug4y#keys-2"
  ],
  "service": [
    {
      "id": "did:ccp:3i9BLRUqGGfeuJ9Esjfw3RWYug4y#resolver",
      "type": "DIDResolve",
      "serviceEndpoint": "https://did.baidu.com"
    },
    {
      "id": "did:ccp:3i9BLRUqGGfeuJ9Esjfw3RWYug4y#hub",
      "type": "IdentityHub",
      "serviceEndpoint": "{\"@context\":\"https://schema.identity.foundation/hub\",\"@type\":\"BaiduHubServiceEndpoint\",\"locations\":[\"https://did.baidu.com/v1/identity-hub\"]}"
    }
  ],
  "proof": {
    "type": "Secp256k1",
    "creator": "did:ccp:3i9BLRUqGGfeuJ9Esjfw3RWYug4y#keys-1",
    "signatureValue": "3044022020e8ca348d1e72eb3f24487cec1a0a3235c6447c569c976123c2b70fd596907d02206d5de5100c5c944e15fd9a3bf06184f0b1c4e8f37b3e6be907856fd75cecb377"
  }
}

添加 Identity hub

在 DID Document 的 Service 列表中添加使用的 Identity hub(创建didClient时配置中的 hub)。


let result = await didClient.addIdentityHub(didInfo);

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | ------- | ---- | ------ | ----------- | | didInfo | 是 | object | did及其私钥 |

返回数据参数详情

字段 必选 类型 说明
object 更新后的 DID Document

返回示例

{
  "@context": "https://w3id.org/did/v1",
  "id": "did:ccp:4W8PQjwggSCsQVsFKcjdCWm3KzfU",
  "version": 2,
  "created": "2020-01-30T13:23:47.571Z",
  "updated": "2020-01-30T13:24:08.327Z",
  "publicKey": [
    {
      "id": "did:ccp:4W8PQjwggSCsQVsFKcjdCWm3KzfU#keys-1",
      "type": "Secp256k1",
      "publicKeyHex": "041f35919bdf83f96615cb33f732d13b9f5f4cb44f41c3f6b664300d69a6e89d0089a26a5d5c220bc80f449a7644079adbefea026cbdc1bbf795b8b41deb0260f0"
    },
    {
      "id": "did:ccp:4W8PQjwggSCsQVsFKcjdCWm3KzfU#keys-2",
      "type": "Secp256k1",
      "publicKeyHex": "0498c4647dd65d2d94cf5f79f4cf3008d41c2051a4ac600213a40811117f561949ec068045b9167b2ef18fbf395d87eba13be9ff972a7f337a8ea92a827f94e102"
    }
  ],
  "authentication": [
    "did:ccp:4W8PQjwggSCsQVsFKcjdCWm3KzfU#keys-1"
  ],
  "recovery": [
    "did:ccp:4W8PQjwggSCsQVsFKcjdCWm3KzfU#keys-2"
  ],
  "service": [
    {
      "id": "did:ccp:4W8PQjwggSCsQVsFKcjdCWm3KzfU#resolver",
      "type": "DIDResolve",
      "serviceEndpoint": "https://did.baidu.com"
    },
    {
      "id": "did:ccp:4W8PQjwggSCsQVsFKcjdCWm3KzfU#hub",
      "type": "IdentityHub",
      "serviceEndpoint": "{\"@context\":\"https://schema.identity.foundation/hub\",\"@type\":\"UserHubEndpoint\",\"instance\":[\"did:ccp:4XF8B3KS7NBp3KhqjZZyBRow2pUu\"]}"
    }
  ],
  "proof": {
    "type": "Secp256k1",
    "creator": "did:ccp:4W8PQjwggSCsQVsFKcjdCWm3KzfU#keys-1",
    "signatureValue": "304402204079f5c1903445f4e4c0eb1e81b72bad8e353141437d8b14f6f30cce4d0ab68402206366a0ac4165bfab2c5b9d0cfcdf072cee085d3f1c5ba7ab0bd17414078e53d9"
  }
}

删除 Identity hub

在 DID Document 的 Service 列表中删除使用的 Identity hub。


let result = await didClient.deleteIdentityHub(didInfo);

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | ------- | ---- | ------ | ----------- | | didInfo | 是 | object | did及其私钥 |

返回数据参数详情

字段 必选 类型 说明
didDocument object 更新后的 DID Document

返回示例

{
  "@context": "https://w3id.org/did/v1",
  "id": "did:ccp:4W8PQjwggSCsQVsFKcjdCWm3KzfU",
  "version": 3,
  "created": "2020-01-30T13:23:47.571Z",
  "updated": "2020-01-30T13:24:16.002Z",
  "publicKey": [
    {
      "id": "did:ccp:4W8PQjwggSCsQVsFKcjdCWm3KzfU#keys-1",
      "type": "Secp256k1",
      "publicKeyHex": "041f35919bdf83f96615cb33f732d13b9f5f4cb44f41c3f6b664300d69a6e89d0089a26a5d5c220bc80f449a7644079adbefea026cbdc1bbf795b8b41deb0260f0"
    },
    {
      "id": "did:ccp:4W8PQjwggSCsQVsFKcjdCWm3KzfU#keys-2",
      "type": "Secp256k1",
      "publicKeyHex": "0498c4647dd65d2d94cf5f79f4cf3008d41c2051a4ac600213a40811117f561949ec068045b9167b2ef18fbf395d87eba13be9ff972a7f337a8ea92a827f94e102"
    }
  ],
  "authentication": [
    "did:ccp:4W8PQjwggSCsQVsFKcjdCWm3KzfU#keys-1"
  ],
  "recovery": [
    "did:ccp:4W8PQjwggSCsQVsFKcjdCWm3KzfU#keys-2"
  ],
  "service": [
    {
      "id": "did:ccp:4W8PQjwggSCsQVsFKcjdCWm3KzfU#resolver",
      "type": "DIDResolve",
      "serviceEndpoint": "https://did.baidu.com"
    }
  ],
  "proof": {
    "type": "Secp256k1",
    "creator": "did:ccp:4W8PQjwggSCsQVsFKcjdCWm3KzfU#keys-1",
    "signatureValue": "30440220761091619f771edc19bc9eae6f45a1e6edb74f23466285255901bb9da7699c3702206bc276a8a378ee6a5ad5bb097b14ea6890d77c06402c4fcc23738804e95ebf31"
  }
}

将数据存入 Identity hub

将数据加密存储到 hub 中。


let result = await didClient.uploadDataToHub(didInfo, data, type);

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | ------- | ---- | ------ | ----------------------- | | didInfo | 是 | object | did及其私钥 | | data | 是 | string | 待存储的数据 | | type | 否 | string | 数据类型,默认为'Claim' |

返回数据参数详情

字段 必选 类型 说明
string 数据 ID,即 dataId

返回示例

'8abd3c715857323d9887b4811afcd9cdac822f48376f7456b346f4604b596aa6'

删除 Identity hub中的数据

删除存储在 hub 中的数据。


let result = await didClient.deleteDataFromHub(didInfo, dataId, type);

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | ------- | ---- | ------ | ----------------------- | | didInfo | 是 | object | did及其私钥 | | dataId | 是 | string | 待删除的数据ID | | type | 否 | string | 数据类型,默认为'Claim' |

返回数据参数详情

字段 必选 类型 说明
string 被删除数据的最新 revisionId,如果没有更新,则为 dataId

返回示例

'75c72a93a95e4408c0a09143a83d6e5d9d5f73c3161b531f70026b98402e51f2'

更新数据

更新存储在 hub 中的数据。


let result = await didClient.updateDataInHub(didInfo, data, dataId, type);

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | ------- | ---- | ------ | ----------------------- | | didInfo | 是 | object | did及其私钥 | | data | 是 | string | 待更新的数据 | | dataId | 是 | string | 数据 ID | | type | 否 | string | 数据类型,默认为'Claim' |

返回数据参数详情

字段 必选 类型 说明
string 更新后,数据新版本的 id

返回示例

'22f1d7e5ebfb9dc07857137b4bb2baf75ac2423e1d8a175ed28d23ee41b06194'

查询 Identity hub 中存储的数据列表

查询hub 中存储的数据的元信息列表,不真正下载源数据,只能查询自己的数据。


let result = await didClient.getMetaFromHub(didInfo, type);

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | ------- | ---- | ------ | ----------------------------- | | didInfo | 是 | object | did及其私钥 | | type | 否 | string | 查询的数据类型,默认为'claim' |

返回数据参数详情

字段 必选 类型 说明
Array 元信息列表

返回示例

[
  {
    "interface": "Collections",
    "context": "schema.identity.foundation/0.1",
    "type": "Claim",
    "id": "8abd3c715857323d9887b4811afcd9cdac822f48376f7456b346f4604b596aa6",
    "sub": "did:ccp:4W8PQjwggSCsQVsFKcjdCWm3KzfU",
    "created_at": "2020-01-30T13:24:26.824Z",
    "updated_at": "2020-01-30T13:24:26.824Z",
    "created_by": "did:ccp:4W8PQjwggSCsQVsFKcjdCWm3KzfU",
    "commit_strategy": "basic",
    "hash": "0d1901949a83704f181e0c21c89f5d66a6cd6d3c8983a848db6650cc5551c8d3"
  }
]

获取 Identity hub 中存储的数据

获取 hub 中存储的数据,可以获取自己的数据,也可以获取别人授权分享的数据。


let result = await didClient.getDataFromHub(didInfo, dataId, ownerDid);

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | -------- | ---- | ------ | ---------------------------------------------------------------------------------------------- | | didInfo | 是 | object | did及其私钥 | | dataId | 是 | string | 数据 Id | | ownerDid | 否 | string | 数据拥有者DID,如果是访问自己的数据,则可以不填,如果通过授权分享获取其他 DID 的数据,需要填写 |

返回数据参数详情

字段 必选 类型 说明
string 解密后的数据源文

获取自己的数据,如果没有对应数据,则返回undefined。 获取其他 DID 的数据,没有授权会抛出错误permissions_required,如果没有对应数据,则抛出错误not_found

返回示例

'{"@context":["https://www.w3.org/2018/credentials/v1"],"id":"456","type":["ProofClaim"],"issuer":"did:ccp:471jwUNr8dxvVJfFPtzVbMped7mW","issuanceDate":"2020-01-13T11:03:47Z","expirationDate":"2088-04-01T12:01:20Z","credentialSubject":{"id":"did:ccp:ceNobbK6Me9F5zwyE3MKY88QZLw","shortDescription":"实名认证声明","longDescription":"该用户经过了我司的实名认证","type":"RealNameAuthentication"},"revocation":{"id":"https://example.com/v1/claim/revocations","type":"SimpleRevocationListV1"},"proof":[{"type":"Secp256k1","creator":"did:ccp:471jwUNr8dxvVJfFPtzVbMped7mW/1","signatureValue":"3044022051c2115ccfd015e856c797da22f3a2561fb17642103b382264dd3bf9cbe898ed022066aed37712b37f44f21294967947cb33e16cc84713907975b5ec049d4ebbfbeb"}]}'

获取历史版本的数据

获取 hub 中存储的历史版本数据,通过 revisionId 指定版本,只能获取自己的数据。


let result = await didClient.getDataFromHubByRevId(didInfo, dataId, revId);

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | ------- | ---- | ------ | ----------- | | didInfo | 是 | object | did及其私钥 | | dataId | 是 | string | 数据 Id | | revId | 是 | string | 数据版本 Id |

返回数据参数详情

字段 必选 类型 说明
string 解密后的数据源文

如果没有对应数据,则返回undefined

返回示例

'{"@context":["https://www.w3.org/2018/credentials/v1"],"id":"123","type":["ProofClaim"],"issuer":"did:ccp:471jwUNr8dxvVJfFPtzVbMped7mW","issuanceDate":"2020-01-13T11:03:47Z","expirationDate":"2088-04-01T12:01:20Z","credentialSubject":{"id":"did:ccp:ceNobbK6Me9F5zwyE3MKY88QZLw","shortDescription":"实名认证声明","longDescription":"该用户经过了我司的实名认证","type":"RealNameAuthentication"},"revocation":{"id":"https://example.com/v1/claim/revocations","type":"SimpleRevocationListV1"},"proof":[{"type":"Secp256k1","creator":"did:ccp:471jwUNr8dxvVJfFPtzVbMped7mW/1","signatureValue":"3044022051c2115ccfd015e856c797da22f3a2561fb17642103b382264dd3bf9cbe898ed022066aed37712b37f44f21294967947cb33e16cc84713907975b5ec049d4ebbfbeb"}]}'

将数据分享给第三方 DID

为第三方 DID 创建授权,分享hub 中的数据。


let result = await didClient.createPermission(didInfo, dataId, granteeDid, permissionGrant, expiration);

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | --------------- | ---- | ------ | ------------------------------ | | didInfo | 是 | object | did及其私钥 | | dataId | 是 | string | 授权分享的数据 Id | | granteeDid | 是 | string | 被授权的 DID | | permissionGrant | 否 | string | 授权内容,默认为只读,即'-R--' | | expiration | 否 | Date | 授权有效期,默认为1天 |

返回数据参数详情

字段 必选 类型 说明
string 授权 Id,即permissionId

返回示例

'c2e09dd9cf7c40053da674f89c1937c80f6b0c79e124ecf30dbdf3e32b15b944'

查询所有创建的授权

查询创建了哪些授权信息,获取所有创建过的授权信息。


let result = await didClient.getAllPermissions(didInfo);

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | ------- | ---- | ------ | ----------- | | didInfo | 是 | object | did及其私钥 |

返回数据参数详情

字段 必选 类型 说明
Array 授权内容列表

返回示例

[
  {
    "permissionId": "c2e09dd9cf7c40053da674f89c1937c80f6b0c79e124ecf30dbdf3e32b15b944",
    "permission": {
      "owner": "did:ccp:4W8PQjwggSCsQVsFKcjdCWm3KzfU",
      "grantee": "did:ccp:po1YVuWGuZsv9vkWDmzeMD2foha",
      "allow": "-R--",
      "context": "schema.identity.foundation/0.1",
      "type": "Claim",
      "objectId": "8abd3c715857323d9887b4811afcd9cdac822f48376f7456b346f4604b596aa6",
      "key": "1ae0fdda70321435a91c1a6dadbb22e18dff27fa084aede7164336241698b483049ba603853054ed553ef3f8ce2c13385fd552eae8073ceb24f311706626ee287afebe6a214c33f6c0b91bfeff5916469883da486849972fa5035e438a9ac17341",
      "expiration": 1580477071851
    }
  },
  {
    "permissionId": "2ad9142f24333ff6f43b315a167d8db12a968fce1b88c0035ead6730e5aff52c",
    "permission": {
      "owner": "did:ccp:4W8PQjwggSCsQVsFKcjdCWm3KzfU",
      "grantee": "did:ccp:po1YVuWGuZsv9vkWDmzeMD2foha",
      "allow": "-R--",
      "context": "schema.identity.foundation/0.1",
      "type": "Claim",
      "objectId": "8abd3c715857323d9887b4811afcd9cdac822f48376f7456b346f4604b596aa6",
      "key": "1ae0fdda70321435a91c1a6dadbb22e18dff27fa084aede7164336241698b483049ba603853054ed553ef3f8ce2c13385fd552eae8073ceb24f311706626ee287afebe6a214c33f6c0b91bfeff5916469883da486849972fa5035e438a9ac17341",
      "expiration": 1580477071851
    }
  }
]

查询创建的授权

根据 permissionId 查询授权内容。


let result = getPermission(didInfo, permissionId);

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | ------------ | ---- | ------ | ----------- | | didInfo | 是 | object | did及其私钥 | | permissionId | 是 | string | 授权 Id |

返回数据参数详情

字段 必选 类型 说明
permission object 授权内容

返回示例

{
  "owner": "did:ccp:4W8PQjwggSCsQVsFKcjdCWm3KzfU",
  "grantee": "did:ccp:po1YVuWGuZsv9vkWDmzeMD2foha",
  "allow": "-R--",
  "context": "schema.identity.foundation/0.1",
  "type": "Claim",
  "objectId": "8abd3c715857323d9887b4811afcd9cdac822f48376f7456b346f4604b596aa6",
  "key": "1ae0fdda70321435a91c1a6dadbb22e18dff27fa084aede7164336241698b483049ba603853054ed553ef3f8ce2c13385fd552eae8073ceb24f311706626ee287afebe6a214c33f6c0b91bfeff5916469883da486849972fa5035e438a9ac17341",
  "expiration": 1580477071851
}

上传已有授权

将本地已有的授权内容上传到 hub 中。


let result = await didClient.uploadPermission(didInfo, permission);

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | ---------- | ---- | ------ | -------------- | | didInfo | 是 | object | did及其私钥 | | permission | 是 | object | 已有的授权内容 |

返回数据参数详情

字段 必选 类型 说明
string 授权Id

返回示例

'2ad9142f24333ff6f43b315a167d8db12a968fce1b88c0035ead6730e5aff52c'

删除创建的授权

删除已创建的授权信息。


let result = await didClient.deletePermission(didInfo, permissionId);

请求参数详情 | 字段 | 必选 | 类型 | 说明 | | ------------ | ---- | ------ | ----------- | | didInfo | 是 | object | did及其私钥 | | permissionId | 是 | string | 授权信息 ID |

返回数据参数详情

字段 必选 类型 说明
string 被删除授权的 ID

返回示例

'2ad9142f24333ff6f43b315a167d8db12a968fce1b88c0035ead6730e5aff52c'