SIOPv2 OpenID4VP

重要提示! 在继续之前,请阅读EUDI钱包参考实现项目描述

License

目录

简介

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)

解析授权请求 URI

钱包收到验证方形成的 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(...)

持有人的共识,处理有效的授权请求

收到有效的授权钱包后,必须对其进行处理。 根据请求的类型,这意味着

此功能是钱包关心的问题,不受库的直接支持

构建授权响应

在收集持有人的共识后,钱包可以使用该库来形成适当的响应 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
    )

将授权响应分派给验证方/RP (WIP)

处理授权请求的最后一步是将授权响应分派给验证方。 根据验证方在其授权请求中包含的 response_mode,这可以通过以下方式完成

库通过 Dispatcher 类处理此分派。

let authorizationResponse // from previous step
let dispatchResponse = dispatch.dispatch(response: authorizationResponse)

SIOPv2 & OpenId4VP 支持的功能

response_mode

钱包可以采用 Web 或移动应用程序的形式。 OpenId4VP 描述了这两种情况的流程。 鉴于我们专注于移动钱包,我们可以假设 AuthorizationRequest 始终包含 response_mode

库目前支持 response_mode

支持的客户端 ID 方案

库要求存在 client_id_scheme,并且具有以下值之一

检索授权请求

根据 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_definitionpresentation_definition_uri 参数来表达所请求凭据的要求。

根据 OpenId4VP,验证方可以通过以下方式传递 presentation_definition

库支持所有这些选项

授权请求中的客户端元数据

根据 OpenId4VP,验证方可以传递其元数据(客户端元数据)

支持的响应类型

库目前支持 response_type 等于 id_tokenvp_token id_token

依赖

许可详情

版权所有 (c) 2023 欧盟委员会

根据 Apache License Version 2.0(“许可证”)获得许可;除非遵守许可证,否则您不得使用此文件。 您可以在以下网址获得许可证副本:

https://apache.ac.cn/licenses/LICENSE-2.0

除非适用法律要求或以书面形式约定,否则软件是按“原样”分发的,不提供任何形式的明示或暗示的担保或条件。 请参阅许可证,以了解管理权限和限制的特定语言。