应用方接入
本文将为您介绍应用方如何与络谱用户建立连接、要求出示证照以及获得证照验证结果的过程。
接入流程:
- 应用方发起verifierCreateProofRequest请求
- 应用方与络谱空间App用户建立连接
- 获取验证结果
步骤1:发起verifierCreateProofRequest请求
- 接口url:
http://TOOLS_HOST:PORT/anoncreds/verifierCreateProofRequest.json
- 注意事项:以下3种场景中,只有通用方式的请求参数中需要theirDid
场景1:应用方app方式
应用方app,通过URL调起络谱空间app来请求数字证照
调起URL格式如下:
brop://app.brop.cn/verifier/credentials?proofConditionsQRCodeDataJson=<proofConditionsQRCodeDataJson>
参考示例:
1、调用verifierCreateProofRequest接口获得返回信息,如下所示:
{
"code": "SUCCESS",
"message": {
"reason": "请求成功!",
"code": "10000"
},
"detail": "{\"requestedPredicates\":[{\"name\":\"name\",\"ptype\":\"==\",\"pvalue\":\"张三\",\"pint\":\"252598315956361\",\"restrictions\":[{\"schemaId\":\"Hgq2y4crjAaxEDCK15Uh3f\",\"credDefId\":\"M9tUJ72o4VcydGgGw7nnwN\"}]}],\"verifyDid\":\"did:brop:9Yp3ZD8FYpXUFNcxWs9cCy\",\"nonce\":\"1204463554675731036523380\",\"verifyName\":\"test\"}"
}
2、解析得到proofConditionsQRCodeDataJson为:
{
"requestedPredicates": [
{
"name": "name",
"ptype": "==",
"pvalue": "张三",
"pint": "252598315956361",
"restrictions": [
{
"schemaId": "Hgq2y4crjAaxEDCK15Uh3f",
"credDefId": "M9tUJ72o4VcydGgGw7nnwN"
}
]
}
],
"verifyDid": "did:brop:9Yp3ZD8FYpXUFNcxWs9cCy",
"nonce": "1204463554675731036523380",
"verifyName": "test"
}
3、拼接得到调起络谱空间的URL
brop://app.brop.cn/verifier/credentials?proofConditionsQRCodeDataJson={"requestedPredicates":[{"name":"name","ptype":"==","pvalue":"张三","pint":"252598315956361","restrictions":[{"schemaId":"Hgq2y4crjAaxEDCK15Uh3f","credDefId":"M9tUJ72o4VcydGgGw7nnwN"}]}],"verifyDid":"did:brop:9Yp3ZD8FYpXUFNc xWs9cCy","nonce":"704463595464683415583738","verifyName":"test"}
4、应用方app通过拼接后的url唤醒络谱空间App,用户可查看并处理出示请求
场景2:扫描二维码方式
该场景用于应用方在PC网站上提供二维码,请求用户使用络谱空间App扫码
步骤
1、实现一个网络访问方法。 方法中调用了BROPID Tools中的verifierCreateProofRequest接口,并设置了接口中需要的验证数字证照相关的参数。
这是因为verifierCreateProofRequest接口参数数量众多,二维码容量有限,难以呈现在一个二维码中。
2、根据网络访问方法生成二维码内容。
格式:{"proofRequestUrl":"http://[ip]:[port]/[function]}
3、将上一步的内容生成二维码,络谱空间App扫码后,即可查看并处理出示请求
示例: 应用方需要验证用户姓名:
- 方法名称:proofRequest
- 参数:pValue=张三
生成的二维码内容示例:
{"proofRequestUrl":"http://192.168.2.169:8080/proof/proofRequest?pValue=%E5%BC%A0%E4%B8%89"}
请注意如果参数中有中文,需要进行转码。
场景3:通用方式
该方式适用于应用方与络谱空间App用户已建立连接的情况,应用方数据库中记录了用户的匿名Did、密钥和endpoint地址。当应用方需要给用户发送消息时,可用已有的匿名did关联密钥进行加密,向用户发送消息
参考示例:
应用方向已建立连接的用户发送出示证照的请求。 应用方调用verifierCreateProofRequest接口,传入theirDid,该请求通过did关联的endpoint地址进行发送
//其中theirDid为对方的Did
{
"name": "**保险公司",
"requestedPredicates": [
{
"name": "cardNo",
"ptype": "==",
"pvalue": "530322199108190723",
"pint":"4634369623865295517398439172991143506293299",
"restrictions": [
{
"credDefId": "M9tUJ72o4VcydGgGw7nnwN",
"schemaId": "Hgq2y4crjAaxEDCK15Uh3f"
}
]
}
],
"walletId": "test-verifier",
"walletKey": "12345678",
"theirDid": "did:brop:H4o6VatuZ6BxMwTjFFPvn2"
}
步骤2:应用方与络谱用户建立连接
- 已经建立连接:络谱用户不会发起建立请求,不需要执行这个步骤
未建立连接:应用方通过mq消息收到络谱用户的建立连接请求,需要完成以下步骤:
- 解析收到的mq消息,获得对方的匿名Did
- 调用工具包createAndStoreMyDid接口,创建自己的匿名Did
调用接口createPairwise,建立did关系对
参考示例:
/** * 收到建立连接的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); String myDid = myDidResultObj.getJSONObject("detail").getString("myDid"); }
步骤3: 获取验证结果
应用方通过MQ消息收到用户出示的证照的验证结果,其中nonce对应ProofRequest中的nonce。
MQ消息队列名称:Proof
验证结果
验证结果中nonce与出示请求返回的nonce一一对应,表示络谱用户提供的证照验证的结果
验证成功示例:
{"code":"SUCCESS","message":{"code":"10000","reason":"请求成功"},"detail":{"nonce":"00E0740081F"}}
验证失败示例:
{"code":"SUCCESS","message":{"code":"13001","reason":"proof验证失败!"},"detail":{"nonce":"00E0740081F"}}
参考示例:
/**
* 收到数字证明验证结果的MQ消息
* @param msg
*/
@JmsListener(destination = "Proof")
public void receivedQueue(String msg) {
//1、解析消息体,得到验证结果和nonce
//2、业务代码
}