did:wba方法是W3C去中心化标识符(DIDs)标准下的一个草案方法规范。W3C DIDs标准于2022年发布为W3C推荐标准,是一种支持可验证、去中心化数字身份的新型标识符。基于DIDs,可以让用户真正掌握自己的身份,也可以提高不同应用之间身份的互操作性。DIDs已被包括Bluesky在内的许多应用广泛采用。
DID 的核心组件是 DID 文档,其中包含与特定 DID 相关的关键信息,比如用于验证 DID 所有者身份的公钥。DID方法定义了如何创建、存储、更新、撤销 DID 文档。
我们设计了一个did:wba方法。did:wba 方法能够充分利用现有的成熟技术和Web基础设施,在不需要彻底重构现有系统的情况下,轻松实现去中心化身份认证。各平台可以使用中心化方式管理自己的账户体系,同时为每个用户创建did:wba DID,以此实现平台之间的互联互通。
使用did:wba方法的身份系统,可以实现类似email的业务特点,各个平台以中心化的方式实现自己的账户体系,同时,各个平台之间可以互联互通。
相对API keys,did:wba方法在安全性上更胜一筹;相对OpenID Connect,did:wba方法交互更加简单,更加的去中心化。他们之间的详细对比可以参考did:wba对比OpenID Connect、API keys。
did:wba方法也具有与OpenID Connect同等的安全性,可以参考did:wba安全性原理解析。
使用did:wba方法,一个最基本的DID文档如下:
{
"@context": [
"https://www.w3.org/ns/did/v1",
"https://w3id.org/security/suites/jws-2020/v1",
"https://w3id.org/security/suites/secp256k1-2019/v1",
"https://w3id.org/security/suites/ed25519-2020/v1",
"https://w3id.org/security/suites/x25519-2019/v1"
],
"id": "did:wba:example.com%3A8800:user:alice",
"verificationMethod": [
{
"id": "did:wba:example.com%3A8800:user:alice#WjKgJV7VRw3hmgU6--4v15c0Aewbcvat1BsRFTIqa5Q",
"type": "EcdsaSecp256k1VerificationKey2019",
"controller": "did:wba:example.com%3A8800:user:alice",
"publicKeyJwk": {
"crv": "secp256k1",
"x": "NtngWpJUr-rlNNbs0u-Aa8e16OwSJu6UiFf0Rdo1oJ4",
"y": "qN1jKupJlFsPFc1UkWinqljv4YE0mq_Ickwnjgasvmo",
"kty": "EC",
"kid": "WjKgJV7VRw3hmgU6--4v15c0Aewbcvat1BsRFTIqa5Q"
}
}
],
"authentication": [
"did:wba:example.com%3A8800:user:alice#WjKgJV7VRw3hmgU6--4v15c0Aewbcvat1BsRFTIqa5Q",
{
"id": "did:wba:example.com%3A8800:user:alice#key-1",
"type": "Ed25519VerificationKey2020",
"controller": "did:wba:example.com%3A8800:user:alice",
"publicKeyMultibase": "zH3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV"
}
],
"keyAgreement": [
{
"id": "did:wba:example.com%3A8800:user:alice#key-2",
"type": "X25519KeyAgreementKey2019",
"controller": "did:wba:example.com%3A8800:user:alice",
"publicKeyMultibase": "z9hFgmPVfmBZwRvFEyniQDBkz9LmV7gDEqytWyGZLmDXE"
}
]
}
其中,authentication中的公钥用于身份验证。也就是说,只要对方能够安全的获取正确的DID文档,就可以获得正确的公钥。然后就可以使用公钥对用户的签名进行验证,从而验证用户的身份。
DID文档的创建、更新、撤销有用户自己决定,比如用户可以选择将DID文档保存在自己的服务器上,也可以选择保存在第三方服务器上。无论存储在哪里,都要保证用户对DID文档的控制权。
同时,用户还需要提供一个HTTP方法,用于让其他人安全的获取自己的DID文档。而获取DID文档的HTTP地址可以从DID转换得来。也就是说,只要用户有了DID,就可以使用HTTP获得对应DID文档。转换方法如下:
示例:
did:wba:example.com:user:alice
-> https://example.com/user/alice/did.json
did:wba可以和HTTP协议结合使用,在一个HTTP请求中,完成身份认证、权限认证、数据交换等操作。他不增加额外的交互次数。下面是did:wba和HTTP协议结合的交互流程:
sequenceDiagram
participant Agent A Client
participant Agent B Server
participant Agent A DID Sever
Note over Agent A Client,Agent B Server: Prerequisites
alt Call B's subscription API
Agent A Client-->>Agent B Server: Call B's subscription API
else Log in and set up A's DID
Agent A Client-->>Agent B Server: Log in and set up A's DID
end
Note over Agent A Client,Agent B Server: First Request
Agent A Client->>Agent B Server: HTTP Request: DID,Signature
Agent B Server->>Agent A DID Sever: Get DID Document
Agent A DID Sever->>Agent B Server: DID Document
Note over Agent B Server: Authentication
Agent B Server->>Agent A Client: HTTP Response: access token
Note over Agent A Client, Agent B Server: Subsequent Requests
Agent A Client->>Agent B Server: HTTP Request: access token
Agent B Server->>Agent A Client: HTTP Response
- 前置条件:需要让Agent B知道Agent A的DID,有两种方式可以实现,下面两种方式任选一种。
- 用户A创建DID,并且将DID文档保存在Agent A 的DID server上。
- 用户A登录到Agent B的系统,并且设置A的DID。或者调用Agent B的订阅API,并设置订阅的DID为A的DID。
- 身份验证流程:
- Agent A作为客户端发起HTTP请求,请求中除了请求数据外,还携带DID、nonce、时间戳、签名等信息。
- Agent B作为server收到请求后,从请求头中提取DID、nonce、时间戳、签名等信息。
- Agent B根据DID从Agent A的DID server中读取DID文档。
- Agent B使用DID文档中的公钥对客户端的签名进行验证。
- 验证通过后,Agent B处理客户端的业务请求,返回业务数据的同时,返回token。
- Agent A在后续请求中携带token,Agent B通过对token的验证,完成对客户端的身份认证。
从整个流程可以看出,使用HTTP,did:wba可以在不增加交互次数的情况下,完成身份认证。并且可以实现两个智能体(或应用)在互相通信的过程中,发起者直接调用对方的订阅接口订阅服务。而不用人工去对方系统注册。这降低了两个智能体之间互联互通的门槛。
- 用例 1:用户通过智能助理访问其他网站上的文件
Alice在example.com网站上存储了一个文件,后来她希望通过智能助理访问该文件。为此,Alice首先在智能助理上创建了一个基于did:wba方法的DID,并登录到example.com,将这个DID与自己的账户关联,并授予DID访问文件的权限。完成设置后,智能助理就可以使用该DID登录example.com,经过身份验证后,example.com允许智能助理访问Alice存储的文件。这个DID也可以配置到其他网站,以便智能助理访问不同平台上的文件。
- 用例 2:用户通过智能助理调用其他平台服务的API
Alice希望通过智能助理调用一个名为example的第三方服务API。首先,Alice在智能助理上创建了一个基于did:wba方法的DID,并使用该DID订购了example平台的相关服务。example服务通过DID完成身份认证,确认购买者是Alice,并记录下她的DID。认证通过后,Alice便可以通过智能助理使用该DID调用example服务的API进行操作。
当前用例中并未列举客户端对服务端的身份认证,事实上这个流程也是可以工作的。
我们已经开发完成并且开源,详细可以参考:https://github.com/chgaowei/AgentConnect/blob/master/README.md#decentralized-authentication-based-on-didwba-and-http