Skip to content

Releases: getyoti/yoti-java-sdk

v3.10.0

09 Dec 11:24
Compare
Choose a tag to compare

Changes

IDV Client

Added

  • Ability to fetch Text Extraction task recommendation
  • Allow the Brand ID to be set at session creation
  • Allow the biometric consent flow to be set at session creation
  • Allow expanded document fields to be requested at session creation
  • Ability to configure client dark mode options at session creation
  • Support for retrieving and deleting tracked devices for a given session
  • Helper methods for finding resources that were used in a check

IDV Sandbox Client

Added

  • Support for static liveness checks
  • Support for configuring a response delay for synchronous checks

v3.9.0

20 Jun 14:23
Compare
Choose a tag to compare

Added

  • Support for Advanced Identity Profile sessions (IDV + Share V2)
  • Support for retrieving failure receipt error details (Share V2)
  • Support for retrieving failure reason (IDV)

v3.8.0

12 Oct 11:05
25ae527
Compare
Choose a tag to compare

New Feature

Support of Digital Identity share service

Yoti Digital ID is now being upgraded!
We have a new API that is improving the sharing flow, for both end-users and integrators like you.

  • share is now session based (must create a share session on the server, using the SDK)
  • share session details (status, progress) can be fetched anytime
  • can subscribe to share session events notification
  • share data can be retrieved anytime until expiration of the receipt

This comes as a replacement of the Dynamic Sharing and Profile services combination.

⚠️You must use the new browser client to fully integrate this new version with your front-end

📖 How to

Here are some snippets of basic use cases.

Create a Digital Identity Client:
DigitalIdentityClient client = DigitalIdentityClient.builder()
                .withClientSdkId(clientSdkId) // Your Yoti Client SDK ID
                .withKeyPairSource(pemKey) // The content of your Yoti .pem key
                .build();
Create a share session:
        Policy policy = Policy.builder()
                .withFullName()
                .withEmail()
                // any other methods supported
                .build();

        /*
        OR with a IdentityProfileRequirements

        Map<String, Object> scheme = new HashMap<>();
        scheme.put("type", "RTW");

        Map<String, Object> identityProfile = new HashMap<>();
        identityProfile.put("trust_framework", "UK_TFIDA");
        identityProfile.put("scheme", scheme);

        .withIdentityProfile(identityProfile)
        */

        Map<String, Object> subject = new HashMap<>();
        subject.put("subject_id", "this is a new share");

        ShareSessionNotification notification = ShareSessionNotification.builder(URI.create("https://service.com/yoti-notifications"))
                .withHeader("X-CUSTOM", "custom")
                .withMethod("GET")
                .withVerifyTls(true)
                .build();
        
        ShareSessionRequest shareSessionRequest = ShareSessionRequest.builder()
                .withRedirectUri(URI.create("/profile"))
                .withPolicy(policy)
                .withSubject(subject)
                .withNotification(notification)
                // .withExtension(ExtensionBuilderByType)
                .build();

        ShareSession shareSession = client.createShareSession(shareSessionRequest);
        
        // shareSession.getId()
        // shareSession.getStatus()
        // shareSession.getExpiry()
Get the receipt of a share session:
        ShareSession session = client.fetchShareSession(sessionId);

        String receiptId = session.getReceiptId();

        Receipt receipt = client.fetchShareReceipt(receiptId);

        // Checking error
        receipt.getError();

        // Assuming no error, getting profile
        Optional<HumanProfile> profile = receipt.getProfile();

        // profile.getSelfie()
        // profile.getFullName()
        // profile.getFamilyName()
        // profile.getGivenNames()
        // profile.getDateOfBirth()
        // profile.getGender()
        // profile.getNationality()
        // profile.getPhoneNumber()
        // profile.getEmailAddress()
        // profile.getPostalAddress()
        // profile.getStructuredPostalAddress()
        // profile.getDocumentDetails()
        // profile.getDocumentImages()
        // profile.getIdentityProfileReport()

Demo

Share v2 demo available, when running the Java Spring Boot example project, at https://localhost:8443/v2/digital-identity-share

v3.7.0

25 Jul 09:28
Compare
Choose a tag to compare

Added

  • Support for non-latin documents
  • Identity Profile Preview
  • Applicant Profile resource from a relying business
  • Applicant Profile Resources on GET /session
  • Import Token support
  • Allow Relying Business to configure user price of IBV session
  • Support for IBV checks
  • Support for Synectics Identity Fraud check

v3.6.0

29 Mar 13:56
Compare
Choose a tag to compare

Added

  • Ability to specific attempts configuration for ID Document Text Extraction Tasks
  • Ability to allow/disallow non-latin documents for resource requirements at session creation
  • Support for Static Liveness Check
  • Support for Face Comparison Check
  • Ability to allow/disallow expired documents for resource requirements at session creation

v3.5.1

14 Jul 17:01
76e1bdb
Compare
Choose a tag to compare

Profile

Demo available, when running the Java Spring Boot example project, at https://localhost:8443/dbs-check

Added

ErrorDetails getter in ActivityFailureException

ErrorDetails exError = ex.errorDetails();
exError.getCode();
exError.getDescription();

Fixed

  • typo in DBS check example project when setting subject_id to the subject objet

v3.5.0

21 Jun 16:35
bc7eb6e
Compare
Choose a tag to compare

Profile

Demo available, when running the Java Spring Boot example project, at https://localhost:8443/dbs-check

Added

  • Error code and description is returned from the failed share in the following format
    Error[code='REASON_CODE', description='REASON_DESCRIPTION']

v3.4.0

04 May 15:47
e611275
Compare
Choose a tag to compare

Profile

Demo available, when running the Java Spring Boot example project, at https://localhost:8443/dbs-check

Added

  • Specify Identity Profile using RequirementsWithIdentityProfile() in DynamicPolicyBuilder
identityProfileJson
{
  "trust_framework": "UK_TFIDA",
  "scheme": {
    "type": "DBS",
    "objective": "STANDARD"
  }
}

DynamicPolicy dynamicPolicy = DynamicPolicy.builder()
                                           .withIdentityProfile(<identityProfileJson>)
                                           .build();
  • Specify subject_id, when used with WithIdentityProfile(), using WithSubject() in DynamicScenarioBuilder
DynamicScenario dynamicScenario = DynamicScenario.builder()
                                                 .withSubject(<subjectId>)
                                                 .withPolicy(dynamicPolicy)
                                                 .build();

ShareUrlResult shareUrl = yotiClient.createShareUrl(dynamicScenario);
  • Retrieve the Identity Profile Report using GetIdentityProfileReport() in HumanProfile
YotiClient yotiClient = YotiClient.builder()
                .withClientSdkId(<clientSdkId>)
                .withKeyPair(<clientKeyPair>)
                .build();

HumanProfile profile = yotiClient.getActivityDetails(<sharingToken>).getUserProfile();

Attribute<Map<String, Object>> identityProfileReport = profile.getIdentityProfileReport();

Map<String, Object> valueRepresentation = identityProfileReport.getValue();

valueRepresentation
{
  "identity_assertion": {
    "current_name": {
      "given_names": "JOHN JIM FRED",
      "first_name": "JOHN",
      "middle_name": "JIM FRED",
      "family_name": "FOO",
      "full_name": "JOHN JIM FRED FOO"
    },
    "date_of_birth": "1979-01-01"
  },
  "verification_report": {
    "report_id": "61b99534-116d-4a25-9750-2d708c0fb168",
    "timestamp": "2022-01-02T15:04:05Z",
    "subject_id": "f0726cb6-97c1-4802-9feb-eb7c6cd07949",
    "trust_framework": "UK_TFIDA",
    "schemes_compliance":
    [
      {
        "scheme": {
          "type": "RTW"
        },
        "requirements_met": true
      }
    ],
    "assurance_process": {
      "level_of_assurance": "MEDIUM",
      "policy": "GPG45",
      "procedure": "M1C",
      "assurance":
      [
        {
          "type": "EVIDENCE_STRENGTH",
          "classification": "4",
          "evidence_links":
          [
            "41960172-ca91-487c-8bb3-2c547f80fe54"
          ]
        },
        {
          "type": "EVIDENCE_VALIDITY",
          "classification": "3",
          "evidence_links":
          [
            "41960172-ca91-487c-8bb3-2c547f80fe54"
          ]
        },
        {
          "type": "VERIFICATION",
          "classification": "3",
          "evidence_links":
          [
            "41960172-ca91-487c-8bb3-2c547f80fe54",
            "fb0880ca-5dd5-4776-badb-17549123c50b"
          ]
        }
      ]
    },
    "evidence": {
      "documents":
      [
        {
          "evidence_id": "41960172-ca91-487c-8bb3-2c547f80fe54",
          "timestamp": "2022-01-02T15:04:05Z",
          "document_fields": {
            "full_name": "JOHN JIM FRED FOO",
            "date_of_birth": "1979-01-01",
            "nationality": "GBR",
            "given_names": "JOHN JIM FRED",
            "family_name": "FOO",
            "place_of_birth": "SAMPLETOWN",
            "gender": "MALE",
            "document_type": "PASSPORT",
            "issuing_country": "GBR",
            "document_number": "123456789",
            "expiration_date": "2030-01-01",
            "date_of_issue": "2020-01-01",
            "issuing_authority": "HMPO",
            "mrz": {
              "type": 2,
              "line1": "P<GBRFOO<<JOHN<JIM<FRED<<<<<<<<<<<<<<<<<<<<<",
              "line2": "1234567892GBR7901018M3001215<<<<<<<<<<<<<<02"
            }
          },
          "passed_checks":
          [
            {
              "check": "CHIP_DIGITAL_SIGNATURE"
            },
            {
              "check": "AUTOMATED_FACE_MATCH"
            },
            {
              "check": "FRAUD_DOCUMENTS_LIST"
            }
          ],
          "verifying_org": "Yoti Ltd.",
          "user_activity_ids":
          [
            "d4764f67-2992-4a69-9ff4-55b0e77cb3d0"
          ],
          "document_images_attribute_id": "f253c8ab-f07b-4aeb-9dd0-50e670c7ebaf"
        }
      ],
      "face": {
        "evidence_id": "fb0880ca-5dd5-4776-badb-17549123c50b",
        "initial_liveness": {
          "type": "ACTIVE",
          "timestamp": "2022-01-02T15:04:05Z"
        },
        "verifying_org": "Yoti Ltd.",
        "user_activity_ids":
        [
          "a8e41187-7f5b-4e83-83d5-dc471452f1a8"
        ],
        "selfie_attribute_id": "cc507f84-f1aa-476a-877b-850e949e0fc8"
      }
    }
  },
  "authentication_report": {
    "report_id": "d7202b65-657e-47a7-9679-7596db617b8c",
    "timestamp": "2022-01-02T15:04:05Z",
    "policy": "GPG44",
    "level": "MEDIUM"
  },
  "proof": "<signature provided here>"
}

  • Retrieve Attribute by id using GetAttributeById() in HumanProfile
Attribute<Object> selfie = profile.getAttributeById(<attribute_id_1>);
Attribute<Object> documentImage = profile.getAttributeById(<attribute_id_2>);

IDV

Added

  • Create session with Identity profile using WithIdentityProfileRequirements() and WithSubject() in SessionSpecificationBuilder
DocScanClient docScanClient = DocScanClient.builder()
      .withClientSdkId(<clientSdkId>)
      .withKeyPair(<clientKeyPair>)
      .build();

subjectJson
{
"subject_id": "<sessionId>"
}

identityProfileRequirementsJson
{
"trust_framework": "UK_TFIDA",
"scheme": {
  "type": "DBS",
  "objective": "STANDARD"
}
}

SessionSpec sessionSpec = SessionSpec.builder()
      .withSubject(<subjectJson>)IdentityProfile to IDV
      .withIdentityProfile(<identityProfileRequirementsJson>)
      .build();

CreateSessionResult session = docScanClient.createSession(sessionSpec);
String sessionId = session.getSessionId();
  • Retrieve session identity profile report using GetIdentityProfile() in GetSessionResult
GetSessionResult sessionResult = docScanClient.getSession(sessionId);

IdentityProfileResponse identityProfile = sessionResult.getIdentityProfile();

String subjectId = identityProfile.getSubjectId();
String result = identityProfile.getResult();
String failureReasonCode = identityProfile.getFailureReason().getReasonCode();
Object identityProfileReport = identityProfile.getIdentityProfileReport();

identityProfileReportJson
{
  "trust_framework": "UK_TFIDA",
  "schemes_compliance":
  [
    {
      "scheme": {
        "type": "DBS",
        "objective": "STANDARD"
      },
      "requirements_met": true,
      "requirements_not_met_info": "some string here"
    }
  ],
  "media": {
    "id": "c69ff2db-6caf-4e74-8386-037711bbc8d7",
    "type": "IMAGE",
    "created": "2022-03-29T11:39:24Z",
    "last_updated": "2022-03-29T11:39:24Z"
  }
}

v3.3.0

22 Oct 12:19
Compare
Choose a tag to compare

Changes

Added

  • Ability to request a session be performed In-Branch (IBV)
  • Support for managing instructions flow as Relying Business for IBV
    • Setting the instructions
    • Retrieving currently set instructions
    • Fetching the contact profile set by the end user
    • Retrieving the generated instructions PDF
    • Triggering the email notification
  • Ability to create Face Capture resources, and upload images to created resources
  • Ability to fetch session configuration
  • Flag for enabling/disabling mobile handoff
  • Ability to request an Issuing Authority sub-check for a Document Authenticity check
  • Ability to set the session deadline using a ZonedDateTime
    • This is instead of using the current client session token expiry (set in seconds)

v3.2.1

17 Aug 09:59
Compare
Choose a tag to compare

Added

  • Added missing getters to WatchlistAdvancedCaSearchConfigResponse

Fixed

  • Added a global property to the internal object mapper to ignore unknown properties, when deserializing JSON data