❗ 重要提示! 在继续之前,请务必阅读EUDI钱包参考实现项目描述
这是一个 Swift 库,它支持 OpenId4VCI (草案 14) 协议。 特别是,该库侧重于协议中钱包的角色,用于:
发布的软件是初始开发版本
该库提供了以下主要 API 元素,以方便该 API 的使用者进行与可验证凭据颁发相关的操作:
要获取凭据颁发者元数据,请使用 CredentialIssuerMetadataResolver
Actor,方法如下:
import OpenID4VCI
let credentialIdentifier = try CredentialIdentifier(value: "https://....")
let credentialIssuerIdentifier = try CredentialIssuerId(CREDENTIAL_ISSUER_PUBLIC_URL)
let resolver = CredentialIssuerMetadataResolver()
let metadata = await resolver.resolve(
source: .credentialIssuer(
credentialIssuerIdentifier
)
)
switch metadata {
...
}
如果失败,原因将在 Error 中返回。
要获取授权服务器的元数据,请使用 AuthorizationServerMetadataResolver
,方法如下:
import OpenID4VCI
let resolver = AuthorizationServerMetadataResolver()
let authServerMetadata = await resolver.resolve(url: "https://....")
该 URL 可以从上面的凭据颁发者元数据中获得。
CredentialOfferRequestResolver
在内部使用上面提到的两个元数据解析器来解析颁发者及其授权服务器的元数据。
给定一个凭据请求 URL,使用 CredentialOfferRequestResolver
按以下方式对其进行验证并解析为 CredentialOffer
:
import OpenID4VCI
let resolver = CredentialOfferRequestResolver()
let result = await resolver
.resolve(
source: try .init(
urlString: url
)
)
switch result {
...
}
OpenID4VCI 规范定义了两种颁发流程:
Issuer
是一个组件,用于方便凭据颁发请求的授权和提交。 它由两个组件组成:
import OpenID4VCI
let credentialIdentifier = try CredentialIdentifier(value: "https://....")
let credentialIssuerIdentifier = try CredentialIssuerId(CREDENTIAL_ISSUER_PUBLIC_URL)
let offer: CredentialOffer = ...
let config: OpenId4VCIConfig = ...
let issuer = try Issuer(
authorizationServerMetadata: offer.authorizationServerMetadata,
issuerMetadata: offer.credentialIssuerMetadata,
config: config
)
给定一个 Issuer
,使用 授权码流程 来授权颁发请求。
import OpenID4VCI
let parPlaced = await issuer.pushAuthorizationCodeRequest(
credentialOffer: offer
)
if case let .success(request) = parPlaced,
case let .par(parRequested) = request {
let authorizationCode = ...
let issuanceAuthorization: IssuanceAuthorization = .authorizationCode(authorizationCode: authorizationCode)
let unAuthorized = await issuer.handleAuthorizationCode(
parRequested: request,
authorizationCode: issuanceAuthorization
)
switch unAuthorized {
case .success(let request):
let authorizedRequest = await issuer.requestAccessToken(authorizationCode: request)
if case let .success(authorized) = authorizedRequest,
case let .noProofRequired(token) = authorized {
print("\(token.accessToken)")
}
case .failure:
throw ...
}
}
throw ...
}
给定一个 Issuer
,使用 预授权码流程 来授权颁发请求。
import OpenID4VCI
let issuer: Issuer = ...
let preAuthorizationCode = ... // pre-authorization code as contained in a credential offer
let authorizedRequest = await issuer.authorizeWithPreAuthorizationCode(
credentialOffer: ...,
authorizationCode: ...,
clientId: ...,
transactionCode: ...
)
给定一个 authorizedRequest
和一个 Issuer
,可以按以下方式放置单个凭据颁发请求:
import OpenID4VCI
let payload: IssuanceRequestPayload = .configurationBased(
credentialConfigurationIdentifier: ...
)
let requestOutcome = try await issuer.request(
proofRequest: ...,
bindingKeys: ..., // SigningKeyProxy array
requestPayload: payload,
responseEncryptionSpecProvider: {
Issuer.createResponseEncryptionSpec($0)
}
)
switch requestOutcome {
}
您还可以查看单元测试以获取更多用法示例。
规范定义了(第 5.1.1 节)当使用授权码流程时,可以使用 authorization_details 参数请求凭据的颁发。 当前版本的库不支持此功能。 它仅支持在授权端点中使用 scope
参数请求颁发。
规范定义了(第 6.2 节)在成功响应令牌后,如果在授权端点中使用了 authorization_details
参数,则响应中会包含 authorization_details
。 当前版本的库不解析/使用此响应属性。
当前版本的库实现了与颁发者的 凭据端点 和 延迟凭据端点 端点的集成。
注意: 凭据请求的属性 credential_identifier
尚未支持。
OpenId4VCI 规范定义了多个扩展点,以适应凭据格式的差异。 当前版本的库完全支持 ISO mDL 配置文件,并初步支持 IETF SD-JWT VC 配置文件。
OpenId4VCI 规范(草案 14)定义了可以包含在凭据颁发请求中的证明,特别是 JWT 证明类型。 当前版本的库支持 JWT 证明类型。
以上所有示例都位于该库的测试目标中。
我们欢迎大家为本项目做贡献。 为确保流程对所有参与者都顺利,请遵循 CONTRIBUTING.md 中的指南。
版权所有 (c) 2023 欧盟委员会
根据 Apache License, Version 2.0(“许可证”)授权; 除非符合许可证,否则您不得使用此文件。 您可以在以下位置获得许可证的副本:
https://apache.ac.cn/licenses/LICENSE-2.0
除非适用法律要求或以书面形式同意,否则按“原样”分发的软件不附带任何形式的明示或暗示的保证或条件。 有关管理权限和限制的特定语言,请参见许可证。