From 4106235e0b5ce56be2a3edc2a1e17c7e7a7fe8ad Mon Sep 17 00:00:00 2001 From: chsavvaidis Date: Tue, 25 Feb 2025 18:45:17 +0200 Subject: [PATCH] feat: add sendTokenRequest() function in OID4VCI --- .../kotlin/id/walt/oid4vc/OpenID4VCI.kt | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/waltid-libraries/protocols/waltid-openid4vc/src/commonMain/kotlin/id/walt/oid4vc/OpenID4VCI.kt b/waltid-libraries/protocols/waltid-openid4vc/src/commonMain/kotlin/id/walt/oid4vc/OpenID4VCI.kt index b2b6fbfe3..ad9fe58fc 100644 --- a/waltid-libraries/protocols/waltid-openid4vc/src/commonMain/kotlin/id/walt/oid4vc/OpenID4VCI.kt +++ b/waltid-libraries/protocols/waltid-openid4vc/src/commonMain/kotlin/id/walt/oid4vc/OpenID4VCI.kt @@ -34,6 +34,7 @@ import id.walt.oid4vc.requests.TokenRequest import id.walt.oid4vc.responses.AuthorizationCodeWithAuthorizationRequestResponse import id.walt.oid4vc.responses.CredentialErrorCode import id.walt.oid4vc.responses.TokenErrorCode +import id.walt.oid4vc.responses.TokenResponse import id.walt.oid4vc.util.JwtUtils import id.walt.oid4vc.util.http import id.walt.policies.Verifier @@ -45,7 +46,9 @@ import id.walt.sdjwt.SDJwtVC.Companion.defaultPayloadProperties import id.walt.sdjwt.SDMap import id.walt.sdjwt.SDPayload import io.github.oshai.kotlinlogging.KotlinLogging +import io.ktor.client.call.* import io.ktor.client.request.* +import io.ktor.client.request.forms.* import io.ktor.client.statement.* import io.ktor.http.* import io.ktor.util.* @@ -172,6 +175,25 @@ object OpenID4VCI { return AuthorizationRequest.fromHttpQueryString(authorizationRequestQueryString) } + suspend fun sendTokenRequest( + metadata: OpenIDProviderMetadata, + tokenRequest: TokenRequest, + ): TokenResponse { + val tokenEndpoint = metadata.tokenEndpoint + ?: throw IllegalArgumentException("Missing token endpoint in issuer metadata.") + + val response = http.submitForm( + url = tokenEndpoint, + formParameters = parametersOf(tokenRequest.toHttpParameters()) + ) + + if (!response.status.isSuccess()) { + throw IllegalArgumentException("Failed to get token: ${response.status.value} - ${response.bodyAsText()}") + } + + return response.body() + } + fun validateTokenRequestRaw(tokenRequestRaw: Map>, authorizationCode: String): TokenRequest { val tokenRequest = parseTokenRequest(tokenRequestRaw) validateAuthorizationCode(tokenRequest, authorizationCode).let {