Skip to content

Commit 1d20432

Browse files
fix(backend): adapt endpoints to oidc4vci (#111)
* fix(backend): adapt endpoints to oidc4vci * fix(backend): adapt endpoints to oid4vci * chivatos * fix * test * xivatos * xivatos * xivatos * save format * chivato * chivato * chivato * chivato * move update format * chivato * chivato * transaction code * tests * tests * update credential response * test * test * refactor(project): fix sonar issues
1 parent 3f209f4 commit 1d20432

File tree

48 files changed

+581
-550
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+581
-550
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
44
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
55
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

7+
## [v1.7.1](https://github.com/in2workspace/in2-issuer-api/releases/tag/v1.7.1)
8+
### Added
9+
- Adapt endpoints to oid4vci.
10+
711
## [v1.7.0](https://github.com/in2workspace/in2-issuer-api/releases/tag/v1.7.0)
812
### Added
913
- Added remote signature configuration.

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ plugins {
1111
}
1212

1313
group = 'es.in2'
14-
version = '1.7.0'
14+
version = '1.7.1'
1515

1616
java {
1717
sourceCompatibility = '17'

src/main/java/es/in2/issuer/backend/backoffice/infrastructure/controller/IssuanceController.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package es.in2.issuer.backend.backoffice.infrastructure.controller;
22

33
import es.in2.issuer.backend.shared.application.workflow.CredentialIssuanceWorkflow;
4-
import es.in2.issuer.backend.shared.domain.model.dto.PreSubmittedCredentialRequest;
4+
import es.in2.issuer.backend.shared.domain.model.dto.PreSubmittedCredentialDataRequest;
55
import es.in2.issuer.backend.shared.domain.service.AccessTokenService;
66
import lombok.RequiredArgsConstructor;
77
import lombok.extern.slf4j.Slf4j;
88
import org.springframework.http.HttpHeaders;
99
import org.springframework.http.HttpStatus;
10+
import org.springframework.http.MediaType;
1011
import org.springframework.web.bind.annotation.*;
1112
import reactor.core.publisher.Mono;
1213

@@ -24,20 +25,23 @@ public class IssuanceController {
2425
@PostMapping("/backoffice/v1/issuances")
2526
@ResponseStatus(HttpStatus.CREATED)
2627
public Mono<Void> internalIssueCredential(@RequestHeader(HttpHeaders.AUTHORIZATION) String bearerToken,
27-
@RequestBody PreSubmittedCredentialRequest preSubmittedCredentialRequest) {
28+
@RequestBody PreSubmittedCredentialDataRequest preSubmittedCredentialDataRequest) {
2829
String processId = UUID.randomUUID().toString();
2930
return accessTokenService.getCleanBearerToken(bearerToken).flatMap(
30-
token -> credentialIssuanceWorkflow.execute(processId, preSubmittedCredentialRequest, token, null));
31+
token -> credentialIssuanceWorkflow.execute(processId, preSubmittedCredentialDataRequest, token, null));
3132
}
3233

33-
@PostMapping("/vci/v1/issuances")
34+
@PostMapping(
35+
value = "/vci/v1/issuances",
36+
consumes = MediaType.APPLICATION_JSON_VALUE,
37+
produces = MediaType.APPLICATION_JSON_VALUE)
3438
@ResponseStatus(HttpStatus.CREATED)
3539
public Mono<Void> externalIssueCredential(@RequestHeader(HttpHeaders.AUTHORIZATION) String bearerToken,
3640
@RequestHeader(name = "X-Id-Token", required = false) String idToken,
37-
@RequestBody PreSubmittedCredentialRequest preSubmittedCredentialRequest) {
41+
@RequestBody PreSubmittedCredentialDataRequest preSubmittedCredentialDataRequest) {
3842
String processId = UUID.randomUUID().toString();
3943
return accessTokenService.getCleanBearerToken(bearerToken).flatMap(
40-
token -> credentialIssuanceWorkflow.execute(processId, preSubmittedCredentialRequest, token, idToken));
44+
token -> credentialIssuanceWorkflow.execute(processId, preSubmittedCredentialDataRequest, token, idToken));
4145
}
4246

4347
}

src/main/java/es/in2/issuer/backend/oidc4vci/domain/model/AuthorizationServerMetadata.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77

88
@Builder
99
public record AuthorizationServerMetadata(
10-
@JsonProperty("issuer") String issuer,
11-
@JsonProperty("token_endpoint") String tokenEndpoint,
12-
@JsonProperty("response_types_supported") Set<String> responseTypesSupported,
13-
@JsonProperty("pre-authorized_grant_anonymous_access_supported") boolean preAuthorizedGrantAnonymousAccessSupported
10+
@JsonProperty(value = "issuer", required = true) String issuer,
11+
@JsonProperty(value = "token_endpoint", required = true) String tokenEndpoint,
12+
@JsonProperty(value = "response_types_supported", required = true) Set<String> responseTypesSupported,
13+
@JsonProperty(value = "pre-authorized_grant_anonymous_access_supported", required = true) boolean preAuthorizedGrantAnonymousAccessSupported
1414
) {
1515
}

src/main/java/es/in2/issuer/backend/oidc4vci/domain/model/CredentialIssuerMetadata.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88

99
@Builder
1010
public record CredentialIssuerMetadata(
11-
@JsonProperty("credential_issuer") String credentialIssuer,
12-
@JsonProperty("issuance_endpoint") String issuanceEndpoint,
13-
@JsonProperty("credential_endpoint") String credentialEndpoint,
11+
@JsonProperty(value = "credential_issuer", required = true) String credentialIssuer,
12+
@JsonProperty(value = "issuance_endpoint", required = true) String issuanceEndpoint,
13+
@JsonProperty(value = "credential_endpoint", required = true) String credentialEndpoint,
1414
@JsonProperty("deferred_credential_endpoint") String deferredCredentialEndpoint,
15-
@JsonProperty("credential_configurations_supported") Map<String, CredentialConfiguration> credentialConfigurationsSupported
15+
@JsonProperty(value = "credential_configurations_supported", required = true) Map<String, CredentialConfiguration> credentialConfigurationsSupported
1616
) {
1717

1818
@Builder

src/main/java/es/in2/issuer/backend/oidc4vci/domain/model/TokenResponse.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@
55

66
@Builder
77
public record TokenResponse(
8-
@JsonProperty("access_token") String accessToken,
9-
@JsonProperty("token_type") String tokenType,
10-
@JsonProperty("expires_in") long expiresIn,
11-
@JsonProperty("c_nonce") String nonce,
12-
@JsonProperty("c_nonce_expires_in") Long nonceExpiresIn) {
8+
@JsonProperty(value = "access_token", required = true) String accessToken,
9+
@JsonProperty(value = "token_type", required = true) String tokenType,
10+
@JsonProperty(value = "expires_in", required = true) long expiresIn,
11+
@JsonProperty(value = "refresh_token", required = true) String refreshToken) {
1312
}

src/main/java/es/in2/issuer/backend/oidc4vci/domain/service/impl/TokenServiceImpl.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,9 @@
1616
import java.time.temporal.ChronoUnit;
1717
import java.util.Map;
1818
import java.util.NoSuchElementException;
19-
import java.util.concurrent.TimeUnit;
2019

2120
import static es.in2.issuer.backend.oidc4vci.domain.util.Constants.ACCESS_TOKEN_EXPIRATION_TIME_DAYS;
2221
import static es.in2.issuer.backend.shared.domain.util.Constants.GRANT_TYPE;
23-
import static es.in2.issuer.backend.shared.domain.util.Constants.PRE_AUTH_CODE_EXPIRY_DURATION_MINUTES;
2422
import static es.in2.issuer.backend.shared.domain.util.Utils.generateCustomNonce;
2523

2624
@Slf4j
@@ -49,16 +47,11 @@ public Mono<TokenResponse> generateTokenResponse(
4947
String accessToken = generateAccessToken(preAuthorizedCode, issueTimeEpochSeconds, expirationTimeEpochSeconds);
5048
String tokenType = "bearer";
5149
long expiresIn = expirationTimeEpochSeconds - Instant.now().getEpochSecond();
52-
long nonceExpiresIn = (int) TimeUnit.SECONDS.convert(
53-
PRE_AUTH_CODE_EXPIRY_DURATION_MINUTES,
54-
TimeUnit.MINUTES);
5550

5651
return TokenResponse.builder()
5752
.accessToken(accessToken)
5853
.tokenType(tokenType)
5954
.expiresIn(expiresIn)
60-
.nonce(nonce)
61-
.nonceExpiresIn(nonceExpiresIn)
6255
.build();
6356
}));
6457
}

src/main/java/es/in2/issuer/backend/oidc4vci/infrastructure/controller/CredentialController.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import es.in2.issuer.backend.shared.application.workflow.CredentialIssuanceWorkflow;
44
import es.in2.issuer.backend.shared.domain.model.dto.CredentialRequest;
5-
import es.in2.issuer.backend.shared.domain.model.dto.VerifiableCredentialResponse;
5+
import es.in2.issuer.backend.shared.domain.model.dto.CredentialResponse;
66
import es.in2.issuer.backend.shared.domain.service.AccessTokenService;
77
import lombok.RequiredArgsConstructor;
88
import lombok.extern.slf4j.Slf4j;
@@ -25,7 +25,8 @@ public class CredentialController {
2525
private final AccessTokenService accessTokenService;
2626

2727
@PostMapping(produces = MediaType.APPLICATION_JSON_VALUE)
28-
public Mono<ResponseEntity<VerifiableCredentialResponse>> createVerifiableCredential(
28+
@ResponseStatus(HttpStatus.OK)
29+
public Mono<ResponseEntity<CredentialResponse>> createVerifiableCredential(
2930
@RequestHeader(HttpHeaders.AUTHORIZATION) String authorizationHeader,
3031
@RequestBody CredentialRequest credentialRequest) {
3132
String processId = UUID.randomUUID().toString();

src/main/java/es/in2/issuer/backend/oidc4vci/infrastructure/controller/DeferredCredentialController.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
import es.in2.issuer.backend.shared.application.workflow.CredentialIssuanceWorkflow;
44
import es.in2.issuer.backend.shared.domain.model.dto.DeferredCredentialRequest;
5-
import es.in2.issuer.backend.shared.domain.model.dto.VerifiableCredentialResponse;
5+
import es.in2.issuer.backend.shared.domain.model.dto.CredentialResponse;
6+
import es.in2.issuer.backend.shared.domain.model.dto.DeferredCredentialResponse;
67
import lombok.RequiredArgsConstructor;
78
import lombok.extern.slf4j.Slf4j;
89
import org.springframework.http.HttpHeaders;
@@ -23,7 +24,7 @@ public class DeferredCredentialController {
2324

2425
@PostMapping(produces = MediaType.APPLICATION_JSON_VALUE)
2526
@ResponseStatus(HttpStatus.OK)
26-
public Mono<VerifiableCredentialResponse> getCredential(
27+
public Mono<DeferredCredentialResponse> getCredential(
2728
@RequestHeader(HttpHeaders.AUTHORIZATION) String authorizationHeader,
2829
@RequestBody DeferredCredentialRequest deferredCredentialRequest) {
2930
// todo: Check if the authorization header is needed here

src/main/java/es/in2/issuer/backend/shared/application/workflow/CredentialIssuanceWorkflow.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,12 @@
55

66
public interface CredentialIssuanceWorkflow {
77

8-
Mono<Void> execute(String processId, PreSubmittedCredentialRequest preSubmittedCredentialRequest, String bearerToken, String idToken);
8+
Mono<Void> execute(String processId, PreSubmittedCredentialDataRequest preSubmittedCredentialDataRequest, String bearerToken, String idToken);
99

1010
// Refactor
11-
Mono<VerifiableCredentialResponse> generateVerifiableCredentialResponse(String processId, CredentialRequest credentialRequest, String token);
11+
Mono<CredentialResponse> generateVerifiableCredentialResponse(String processId, CredentialRequest credentialRequest, String token);
1212

13-
Mono<BatchCredentialResponse> generateVerifiableCredentialBatchResponse(String username, BatchCredentialRequest batchCredentialRequest, String token);
14-
15-
Mono<VerifiableCredentialResponse> generateVerifiableCredentialDeferredResponse(String processId, DeferredCredentialRequest deferredCredentialRequest);
13+
Mono<DeferredCredentialResponse> generateVerifiableCredentialDeferredResponse(String processId, DeferredCredentialRequest deferredCredentialRequest);
1614

1715
Mono<Void> bindAccessTokenByPreAuthorizedCode(String processId, AuthServerNonceRequest authServerNonceRequest);
1816
}

0 commit comments

Comments
 (0)