Skip to content

fix: route forward and identity clients to dedicated base URLs#558

Open
armando-rodriguez-cko wants to merge 5 commits into
masterfrom
fix/forward-identity-base-urls
Open

fix: route forward and identity clients to dedicated base URLs#558
armando-rodriguez-cko wants to merge 5 commits into
masterfrom
fix/forward-identity-base-urls

Conversation

@armando-rodriguez-cko
Copy link
Copy Markdown
Contributor

@armando-rodriguez-cko armando-rodriguez-cko commented May 11, 2026

Summary

The forward service and the identity-verification services (applicants, identity-verification, AML screening, face-authentication, ID document verification) live on their own hosts in the swagger spec, not under api.checkout.com. This PR adds dedicated URIs for both and routes the corresponding clients through them. It also tightens the subdomain validation regex to match the AWS PrivateLink prefix format documented at https://www.checkout.com/docs/developer-resources/api/private-connections/aws-privatelink^(?:pl-)?[a-z0-9]+$ (alphanumeric, optionally prefixed by the literal pl-). Finally, it exposes the identity-verification OAuth scope as a typed enum constant and adds a 100ms timeout to the subdomain Regex (SonarLint S6444).

Changes

  • src/CheckoutSdk/Environment.cs — adds ForwardApiUri and IdentityApiUri to the Sandbox/Production [Environment] attributes; tightens subdomain regex to ^(?:pl-)?[a-z0-9]+$ with a 100ms timeout
  • src/CheckoutSdk/EnvironmentAttribute.cs — adds ForwardApiUri/IdentityApiUri properties and constructor parameters
  • src/CheckoutSdk/OAuthScope.cs — adds [OAuthScope("identity-verification")] IdentityVerification
  • src/CheckoutSdk/CheckoutApi.cs — adds ForwardApiClient and IdentityApiClient factory methods; routes _forwardClient to forward URI; caches the identity ApiClient once and reuses it across _applicantsClient, _amlScreeningClient, _faceAuthenticationClient, _idDocumentVerificationClient, _identityVerificationClient (avoids the .NET HttpClient anti-pattern of multiple instances per host)
  • test/CheckoutSdkTest/CheckoutConfigurationTest.cs — updates subdomain corpus: removes test-123 from accepted, adds pl-vkuhvk4v (docs example) to accepted, adds test-123/foo-bar/pl- to rejected; adds ShouldHaveCorrectForwardAndIdentityUrisForSandbox/…ForProduction
  • test/CheckoutSdkTest/SubdomainFunctionalityTest.cs — replaces the "invalid_subdomain" test value with one that's actually rejected (invalid_subdomain!); renames the hyphenated happy-path test to ShouldAddSubdomainForPrivateLinkPrefix and uses the docs example

API Reference

  • https://forward.checkout.com / https://forward.sandbox.checkout.com — forward service (POST /forward (beta), GET /forward/{id} (beta), POST /forward/secrets, GET|POST|DELETE /forward/secrets/{name}). Scopes: forward (plus forward:secrets for secrets endpoints).
  • https://identity-verification.checkout.com / https://identity-verification.sandbox.checkout.com — identity services (/applicants, /identity-verifications (beta), /aml-verifications (beta), /face-authentications (beta), /id-document-verifications (beta)). Scope: identity-verification.
  • https://pl-{prefix}.api.{sandbox.,}checkout.com — AWS PrivateLink subdomain format

Breaking changes

  • EnvironmentAttribute constructor now requires forwardApiUri and identityApiUri string parameters. Any code decorating a custom enum with [Environment(…)] must add them.
  • The subdomain regex is now stricter: arbitrary hyphenated subdomains like test-123 or foo-bar-baz are rejected. Only plain alphanumeric or the literal PrivateLink form (pl-{prefix}) are accepted.

README

Not affected.

@armando-rodriguez-cko armando-rodriguez-cko requested a review from a team May 11, 2026 13:27
Cache the identity ApiClient instance once in the CheckoutApi
constructor instead of constructing a new ApiClient (with its own
HttpClient from the factory) inside each of the five identity
clients. Behaviour unchanged; avoids redundant HttpClient
allocations for the five clients that all target the same identity
host.
Per the AWS PrivateLink docs (https://www.checkout.com/docs/developer-resources/api/private-connections/aws-privatelink),
the valid subdomain is the first eight characters of the client_id
(alphanumeric only), optionally with the literal pl- prefix when
calling through PrivateLink. Tighten the regex from RFC-1123-style
hyphenated to ^(?:pl-)?[a-z0-9]+$ and update the test corpus:
test-123 moves to the rejected list, pl-vkuhvk4v (the docs example)
joins the accepted list, and pl-, foo-bar are added as rejected.
The .NET Regex constructor without an explicit timeout can hang
indefinitely on pathological input. Pass a 100ms TimeSpan; the
pattern itself is short and linear, so any execution exceeding
that bound indicates a problem rather than legitimate matching.
david-ruiz-cko
david-ruiz-cko previously approved these changes May 12, 2026
Per the swagger spec, all identity endpoints (applicants,
identity-verifications, aml-verifications, face-authentications,
id-document-verifications) require the OAuth scope
identity-verification. Expose it as a typed enum constant so OAuth
clients can request it without hardcoding the string.
@sonarqubecloud
Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants