❗ 重要提示! 在继续之前,请阅读EUDI钱包参考实现项目描述
OpenID4VP 是一种协议,支持可验证凭据的呈现。它构建于 OAuth 2.0 之上,并支持多种凭据格式,包括 W3C 可验证凭据数据模型、ISO mdoc 和 AnonCreds。 该协议允许简单、安全且对开发者友好的凭据呈现,并且可用于支持凭据呈现和访问令牌的颁发,以便基于钱包中的可验证凭据访问 API
用于可验证呈现的 OpenID Connect (OIDC4VP) 和自颁发 OpenID 提供程序 v2 (SIOP v2) 是两个已获 OpenID 基金会成员批准为 OpenID 实现者草案的规范 1。 SIOP v2 是一种 OpenID 规范,允许最终用户充当自己的 OpenID 提供程序 (OP)。 通过使用自颁发 OP,最终用户可以对自己进行身份验证,并将声明直接呈现给依赖方 (RP),通常是 Web 应用程序,而无需涉及第三方身份提供程序 2。 OIDC4VP 支持使用 OpenID Connect 协议呈现可验证凭据。
发布的软件是初始开发版本
这是一个 Swift 库,符合 Self Issued OpenID Provider v2 (SIOPv2 - draft 12) 和 OpenID for Verifiable Presentations (OpenID4VP - draft 21) 规范,由 OpenID Connect 工作组定义。 特别是,该库侧重于钱包的角色,并且侧重于对这两个协议的使用,因为它们受到 ISO 23220-4 和 ISO-18013-7 的约束
此外,它还支持使用 Presentation Exchange 库版本 2 的可验证呈现。 您可以使用此库来简化 OIDC4VP 与移动应用程序的集成。
库的入口点是类 SiopOpenId4Vp。
您可以使用 Swift Package Manager 将库添加到您的项目中。 版本
import SiopOpenID4VP
let walletConfig: SiopOpenId4VPConfig = SiopOpenId4VPConfig(...)
let siopOpenId4Vp = SiopOpenID4V(walletConfiguration: walletConfig)
钱包收到验证方形成的 OAUTH2 授权请求,该请求可能代表
在同一设备场景中,上述授权请求以深层链接的形式到达钱包。 同样,在跨设备场景中,将通过扫描二维码获取请求。
无论哪种情况,钱包都必须获取代表授权请求的 URI(深层链接或二维码),并要求 SDK 验证该 URI(即确保它代表上述支持的请求之一),此外,还要从验证方收集其他信息,这些信息可能通过引用包含在内(例如 presentation_definition_uri
等)
捕获上述功能的对象是 ResolvedSiopOpenId4VPRequestData
async/await 版本
import SiopOpenID4VP
let authorizationRequestUri : URL = ...
let sdk = SiopOpenID4VP(walletConfiguration: ...)
let result = try await sdk.authorization(url: authorizationRequestUri)
switch result {
...
}
Combine 版本
import SiopOpenID4VP
let authorizationRequestUri : URL = ...
let sdk = SiopOpenID4VP(walletConfiguration:...)
sdk.authorizationPublisher(for: authorizationRequestUri)
.sink { completion in
...
} receiveValue: { authorizationRequest in
...
}
.store(...)
收到有效的授权钱包后,必须对其进行处理。 根据请求的类型,这意味着
id_token
vp_token
此功能是钱包关心的问题,不受库的直接支持
在收集持有人的共识后,钱包可以使用该库来形成适当的响应 AuthorizationResponse。
import SiopOpenID4VP
// Example assumes that requestObject is SiopAuthentication & holder's agreed to the issuance of id_token
let resolved: ResolvedSiopOpenId4VPRequestData = ...
let jwt: JWTString = ... // provided by wallet
let consent: ClientConsent = .idToken(idToken: jwt)
let response = try AuthorizationResponse(
resolvedRequest: resolved,
consent: consent
)
处理授权请求的最后一步是将授权响应分派给验证方。 根据验证方在其授权请求中包含的 response_mode
,这可以通过以下方式完成
response_mode
为 direct_post
或 direct_post.jwt
时),或者redirect_uri
(当 response mode 为 fragment
或 fragment.jwt
时)库通过 Dispatcher 类处理此分派。
let authorizationResponse // from previous step
let dispatchResponse = dispatch.dispatch(response: authorizationResponse)
钱包可以采用 Web 或移动应用程序的形式。 OpenId4VP 描述了这两种情况的流程。 鉴于我们专注于移动钱包,我们可以假设 AuthorizationRequest
始终包含 response_mode
。
库目前支持 response_mode
direct_post
direct_post.jwt
库要求存在 client_id_scheme
,并且具有以下值之一
pre-registered
,假设验证方元数据具有带外知识。 验证方可以发送签名 (JAR) 或纯文本授权请求x509-san-dns
,其中验证方必须发送使用合适的 X509 证书签名的授权请求 (JAR)x509-san-uri
,其中验证方必须发送使用合适的 X509 证书签名的授权请求 (JAR)did
,其中验证方必须发送使用可通过 DID URL 解析的密钥签名的授权请求 (JAR)。verifier_attestation
,其中验证方必须发送已签名的授权请求(JAR),其中包含来自受信任颁发者的验证方证明 JWT根据 OpenID4VP,当 request_uri
参数包含在授权请求中时,钱包必须按照此 URI 获取授权请求。 在这种情况下,有两种方法可以获取请求,由验证方通信的 request_uri_method
控制
在后一种情况下,钱包可以将其 元数据 传递给验证方。 库支持这两种方法。
OAUTH2 预见 AuthorizationRequest
被编码为包含特定 HTTP 参数的 HTTP GET 请求。
另一方面,OpenID4VP 预见除了支持 RFC 9101 之外,上述 HTTP Get 还包含 JWT 编码的 AuthorizationRequest
最后,ISO-23220-4 要求使用 RFC 9101
库支持通过值(使用 request
属性)或通过引用(使用 request_uri
)获取请求对象
验证方使用包含呈现定义 JSON 对象的 presentation_definition
和 presentation_definition_uri
参数来表达所请求凭据的要求。
根据 OpenId4VP,验证方可以通过以下方式传递 presentation_definition
库支持所有这些选项
根据 OpenId4VP,验证方可以传递其元数据(客户端元数据)
库目前支持 response_type
等于 id_token
或 vp_token id_token
版权所有 (c) 2023 欧盟委员会
根据 Apache License Version 2.0(“许可证”)获得许可;除非遵守许可证,否则您不得使用此文件。 您可以在以下网址获得许可证副本:
https://apache.ac.cn/licenses/LICENSE-2.0
除非适用法律要求或以书面形式约定,否则软件是按“原样”分发的,不提供任何形式的明示或暗示的担保或条件。 请参阅许可证,以了解管理权限和限制的特定语言。