发证方接入
接入准备:
- 选择发证模板得到模板编号:
schemaId
- 成功部署接入工具
- 创建发证方真名Did:
issuerDid
接入流程:
- 数字证照声明创建
- 数字证照累加器创建
- 与络谱空间App用户建立匿名关系对
- 数字证照邀请创建
- 数字证照创建
- 数字证照累加器更新
步骤1:数字证照声明创建
发证方通过该步骤在区块链上创建schema对应的数字证照声明,获得数字证照声明Id。
请求路径:
http://TOOLS_HOST:PORT/anoncreds/issuerCreateAndStoreCredentialDef.json
步骤2:数字证照累加器创建
发证方需要创建与步骤1得到的数字证照声明Id对应的累加器,用于后续签发和撤销证书
请求路径:
http://TOOLS_HOST:PORT/anoncreds/issuerCreateAndStoreRevocReg.json
注意事项:
- 实际创建结果,通过MQ消息返回,消息标识:AccumulatorCreate
步骤3:与络谱空间App用户建立匿名关系对
- 已经建立连接:络谱空间App用户不会发起建立请求,不需要执行这个步骤
- 未建立连接:发证方通过mq消息收到络谱空间App用户的建立连接请求,需要完成以下步骤。
获得络谱空间App用户的匿名did 支持两种交互场景:
场景一、用户从络谱空间App打开发证方页面
络谱空间App中发证方的连接中包含了发证方的真名did信息,根据真名did信息可从链上获取发证方的cloud agency endpoint地址。络谱空间App判断是否已与发证方建立连接。若未建立连接,络谱空间App会创建匿名did,并通过cloud agency发送给发证方。
场景二、用户从浏览器打开发证方页面
发证方页面前端唤醒络谱空间APP,URL格式如下:
brop://app.brop.cn/issuer?defId=<defId>&credName=<credName>&issuerName=<issuerName>
唤醒络谱空间App后,与场景一相同,络谱空间App根据发证方did判断是否已建立连接。若未建立连接,络谱空间App会创建匿名did,并通过cloud agency发送给发证方。
发证方解析收到的mq消息,获得对方的匿名Did。
- 调用工具包createAndStoreMyDid接口,创建自己的匿名Did
调用接口createPairwise,建立did关系对
建立匿名关系对MQ消息处理参考示例:
/** * 收到建立连接的MQ消息 * 消息队列名称:ConnectRequest * @param request mq消息体 */ @JmsListener(destination = "ConnectRequest") public void receivedQueue2(String request) { //i. 解析收到的mq消息,获得对方的匿名Did ConnectRequest connectRequest = JSON.parseObject(requestObj.getString("detail"), ConnectRequest.class); String theirDid = connectRequest.getTheirDid(); //ii. 调用工具包createAndStoreMyDid接口,创建自己的匿名Did JSONObject myDidResultObj = apiController.createAndStoreMyDid(walletId, walletKey); String myDid = myDidResultObj.getJSONObject("detail").getString("myDid"); //iii. 调用接口createPairwise,建立did关系对 JSONObject pairwiseResultObj = apiController.createPairwise(walletId, walletKey,theirDid,myDid); }
步骤4:数字证照邀请创建
发证方可在业务系统中为用户提供身份认证功能和签发数字证照服务。 当发证方决定为请求的用户颁发数字证照时,需要先执行当前步骤
请求路径:
http://TOOLS_HOST:PORT/anoncreds/issuerCreateCredentialOffer.json
该接口中参数theirDid需要传入用户匿名Did,参考下文。
获得用户匿名did方法
络谱空间将其匿名身份发送给发证方,发证方页面可以通过前端window.BROP_SPACE.anonDid获取到当前络谱空间App用户的匿名Did。
全局变量
变量名 | 类型 | 说明 |
---|---|---|
window.BROP_SPACE.anonDid | String | 络谱用户的匿名 DID |
全局函数
方法名 | 参数 | 说明 |
---|---|---|
callbackCredApply | nonce: String | nonce 是 TODO |
navigateToApplyPending | 无 | 关闭当前 H5,APP 跳转到证照申请等待页 |
调用示例:
```
window.ReactNativeWebView.postMessage(JSON.stringify({
method: 'callbackCredApply',
nonce: nonce,
}));
```
步骤5:数字证照创建
发证方收到络谱空间App用户创建数字证照的MQ消息时(消息标识:CredentialRequest),执行数字证照创建操作。
请求路径:
http://TOOLS_HOST:PORT/anoncreds/issuerCreateCredential.json
注意事项:
- 参数中credDefId与revRegId必须对应
- 参数credValuesMap、credValues中的属性值==顺序必须与Credential Schema中定义的顺序一致==
- 创建数字证照时需要确认写入哪个累加器。当revRegId长度为0时,需要使用新的累加器,创建累加器参考步骤1
- 创建的数字证照需要更新累加器后才生效,参考步骤6
MQ消息处理参考示例:
/** * 收到创建累加器上链结果的MQ消息 * @param request mq消息体 */ @JmsListener(destination = "CredentialRequest") public void receivedQueue3(String request) { //1.解析mq消息体 //2.调用工具包,发送issuerCreateCredential请求 JSONObject credResultObj = apiController.issuerCreateCredential(walletId, walletKey,schemaId,credDefId,nonce,issuerDid,credReqMetadata,credValuesMap,credValues,revRegId); String credId = credResultObj.getJSONObject("detail").getString("credId"); //当free为0时,需要创建新的累加器供后续发证 String free = myDidResultObj.getJSONObject("detail").getString("free"); if("0".equals(free)){ //创建新的累加器 JSONObject revocResultObj = apiController.issuerCreateAndStoreRevocReg(walletId,walletKey,issuerDid,credDefId,maxCredNum,tag); String revRegId = revocResultObj.getJSONObject("detail").getString("revRegId"); String revRegDefJson = revocResultObj.getJSONObject("detail").getString("revRegDefJson"); //通过MQ消息判断累加器是否上链成功 }
步骤6:更新累加器
创建、撤销数字证照操作后,需要更新累加器,操作才会生效
请求路径: http://TOOLS_HOST:PORT/anoncreds/updateAccumulator.json
注意事项:
- 实际创建结果,通过MQ消息返回,消息标识:AccumulatorUpdate
MQ消息处理参考示例:
/** * 收到更新累加器上链结果的MQ消息 * @param request mq消息体 */ @JmsListener(destination = "AccumulatorUpdate") public void receivedQueue3(String request) { //1.解析mq消息体,获取更新累加器上链结果 }