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,shortDescription
和longDescription
分别是长短描述,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'