Partner Identity Authentication
How to integrate as an identity provider with VerifiMe
Purpose
This guide defines the requirements and process for integrating an external partner as an identity provider (IdP) with VerifiMe. It covers the two supported integration paths, security requirements, and the work required from both the partner and VerifiMe.
Specifications
| Specification | URL |
|---|---|
| OAuth 2.0 (RFC 6749) | RFC 6749 |
| OIDC Core 1.0 | OIDC Core 1.0 |
| OIDC Discovery 1.0 | OIDC Discovery 1.0 |
| CIBA Core 1.0 | CIBA Core 1.0 |
| JWT (RFC 7519) | RFC 7519 |
| JWA (RFC 7518) | RFC 7518 |
Trust Model
VerifiMe is always the identity provider of record. Partner IdP integration means VerifiMe is delegating the "this person is who they say they are" decision to the partner for a specific authentication event. This is a deliberate trust decision, not a technical default.
Key principles:
- A valid partner token proves the partner's private key signed it. VerifiMe holds only the partner's public key and cannot forge tokens.
- If a fraudulent token appears, the partner's private key leaked. VerifiMe can demonstrate this cryptographically (non-repudiation).
- Partners are never self-service. Every integration requires explicit VerifiMe approval.
- Partner SSO authenticates users during the VerifiMe verification intake only, not as an ongoing VerifiMe login mechanism.
Prerequisites
These are non-negotiable before any technical work begins:
- Trust decision: VerifiMe explicitly approves the partner as a trusted identity source, including a security review of the partner's authentication standards and MFA strength.
- Integration agreement: The partner accepts liability for unauthorised account access resulting from a compromise of their IdP. The agreement must cover breach notification obligations and, where either party is APRA-regulated, audit rights under CPS 234.
- Technical contact: Partner nominates an engineering contact for the integration and ongoing support.
- Data processing agreement (DPA): A signed DPA must be in place before any data flows, covering Australian Privacy Act obligations (particularly APP 8 for overseas partners) and GDPR Article 28 compliance where the partner processes EU-resident data.
- AML/CTF obligations: VerifiMe's obligations under the AML/CTF Act are not transferred to the partner. The partner's identity assertion is an authentication credential, not a KYC substitute.
- Availability expectations: The partner's IdP is in the critical path for VerifiMe's verification intake flow. Minimum uptime requirements and incident notification obligations must be agreed before go-live.
- Digital ID Act 2024: This is a private bilateral arrangement and does not require AGDIS accreditation, but VerifiMe uses the Digital ID Act 2024 framework as a benchmark when assessing partner trust decisions.
- Verification intake scope: Partner SSO is used exclusively during the VerifiMe verification intake flow. The partner first registers the user via
POST /v1/user/invite, which creates a pending VerifiMe account. The user then authenticates via the partner IdP, which allows VerifiMe to securely identify them at the start of the verification intake. Partner SSO is not used again once verification is complete.
Supported Integration Paths
Two paths are supported. The choice depends on the partner's technical capability and the desired user experience.
| Path A: Authorisation Code Flow | Path B: CIBA | |
|---|---|---|
| User experience | Redirect to partner, redirect back to VerifiMe | User stays on VerifiMe; approves in partner's app |
| Partner builds | Full OAuth 2.0 / OIDC authorisation server | Backchannel authentication endpoint + push delivery |
| VerifiMe dev effort | Low-moderate | High |
| Partner dev effort | High | Moderate |
| Best for | Partners with existing IdP infrastructure | Partners with mobile apps and push notification capability |
If a partner cannot support either path, they are not suitable as an identity provider. VerifiMe does not support custom or proprietary authentication flows.
Path A: Authorisation Code Flow
Defined in RFC 6749 §4.1 and OIDC Core §3.1
How it works
The user is not expected to initiate the authentication flow. Opening the invite URL is sufficient; VerifiMe handles the rest automatically.
What the partner must provide
- OIDC discovery endpoint at
/.well-known/openid-configuration(OIDC Discovery §3)- Or manually:
authorization_endpoint,token_endpoint,jwks_uri,issuer
- Or manually:
- Client ID issued to VerifiMe (registered on the partner's authorisation server)
- Client authentication method supported at the token endpoint (Basic auth or
client_secret_post); see RFC 6749 §2.3 - Redirect URI whitelist entry for the VerifiMe callback URL for your environment (provided by your VerifiMe technical contact during onboarding)
id_tokensigned with RS256 or ES256 (asymmetric; see Security Requirements)- Profile claims included in
id_token:email,given_name,family_namemust be present in the ID Token directly (not only at the UserInfo endpoint). Partners must configure their authorisation server accordingly; see OIDC Core §5.4 nonceechoed back inid_token: VerifiMe always includes a nonce in the authorisation request; the partner must include it in the ID Token (OIDC Core §2)stateechoed back unchanged in the redirect response (RFC 6749 §4.1.2)
What VerifiMe will do
VerifiMe will register the partner's identity provider configuration and map the partner's claims to VerifiMe user attributes. Authentication is triggered automatically when the user opens the invite URL; no user-facing sign-in option is surfaced. VerifiMe will provide the partner with the client ID and redirect URI required for registration.
Path B: CIBA (Client Initiated Backchannel Authentication)
Defined in CIBA Core 1.0
VerifiMe uses Poll mode (CIBA Core §5): VerifiMe polls the partner's token endpoint until the user approves. No callback endpoint is required from VerifiMe.
How it works
The user is not expected to initiate the authentication flow. Opening the invite URL is sufficient. The user never leaves VerifiMe's UI; authentication happens in the partner's app or via push.
What the partner must provide
- OIDC discovery endpoint at
/.well-known/openid-configurationincluding (CIBA Core §4):backchannel_authentication_endpoint(REQUIRED)backchannel_token_delivery_modes_supportedmust includepoll(REQUIRED)
- Backchannel authentication endpoint (CIBA Core §7.1)
- Content-Type:
application/x-www-form-urlencoded - Required:
scope=openid,login_hint={email}(VerifiMe useslogin_hintas the user identifier hint; exactly one oflogin_hint,login_hint_token, orid_token_hintis required per spec) - Optional:
binding_message={string}(short text displayed to the user during approval) - Returns:
auth_req_id(REQUIRED),expires_in(REQUIRED),interval(OPTIONAL; VerifiMe defaults to 5 seconds if absent)
- Content-Type:
- Out-of-band delivery: push notification, biometric prompt, or in-app approval screen delivered to the user
- Token endpoint supporting the CIBA grant (CIBA Core §10.1):
grant_type=urn:openid:params:grant-type:cibaauth_req_id={auth_req_id}- Returns
id_token,access_token,token_typeon completion - Returns the following error codes during polling (CIBA Core §11):
| Error | Meaning | VerifiMe action |
|---|---|---|
authorization_pending | User not yet authenticated | Continue polling per interval |
slow_down | Polling interval too short | Increase interval by at least 5 seconds, continue |
expired_token | auth_req_id has expired | Abort; restart authentication |
access_denied | User denied the request | Abort; surface error to user |
- On completion:
id_tokenmust meet the same Security Requirements as Path A
What VerifiMe will do
Everything in Path A, plus building the async authentication flow on VerifiMe's side to handle the out-of-band completion.
Note: Path B requires substantially more VerifiMe engineering effort than Path A. Confirm this path is necessary before committing.
Security Requirements (both paths)
id_token signing: asymmetric only
Integration policy requirement. RS256 and ES256 are defined in RFC 7518 §3. ACSC ISM Guidelines for Cryptography recommend ECDSA (ES256) in preference to RSA (RS256).
- Partner must sign the
id_tokenwith ES256 (preferred) or RS256 - ES256 (ECDSA with P-256) is preferred: smaller key sizes, better performance, and consistent with ACSC ISM cryptographic guidance
- RS256 is accepted where ES256 is not supported; minimum key size: RSA-2048
- HMAC (HS256) is not accepted. A shared secret creates ambiguity about which party signed the token and removes non-repudiation, which is unacceptable for a multi-partner deployment.
- VerifiMe stores only the partner's public key via the partner's JWKS endpoint. The private key never leaves the partner.
- Non-repudiation: a valid asymmetric signature proves the partner's private key produced the token. VerifiMe cannot produce such a token.
- Partners must expose a JWKS endpoint and document their key rotation procedure. VerifiMe caches keys and rotates when a new
kidappears.
nonce claim
OIDC Core §3.1.2.1 and §2
- VerifiMe generates a random nonce per authentication attempt and includes it in the authorisation request
- Per OIDC Core §2: "If present in the Authentication Request, Authorization Servers MUST include a nonce Claim in the ID Token." VerifiMe always sends a nonce, making this a de facto requirement for this integration.
- VerifiMe validates the nonce before accepting the token
- Binds the token to the specific authentication attempt and prevents token substitution attacks
state parameter
- VerifiMe generates a signed
stateparameter and includes it in the authorisation request - The partner must echo
stateback unchanged in the callback redirect - VerifiMe validates the state before processing the callback
- Prevents CSRF attacks and redirect injection
PKCE
- Partners are not required to support PKCE. VerifiMe acts as a confidential client (server-to-server with a client secret); PKCE provides no additional security benefit in this context. This position will be reviewed when OAuth 2.1 is finalised.
Transport security
All API endpoints involved in this integration (authorisation endpoint, token endpoint, backchannel authentication endpoint, JWKS endpoint) must use TLS 1.3. TLS 1.2 is accepted where TLS 1.3 is not supported by the partner's infrastructure, with forward-secrecy cipher suites required. TLS 1.0, TLS 1.1, and SSL 3.0 are not accepted. Certificates must be issued by a publicly trusted CA; self-signed certificates are not accepted in production.
This aligns with VerifiMe's internal standard (TLS 1.3 for all communications) and ACSC guidance on implementing TLS.
Authentication strength
The cryptographic strength of the id_token is only as strong as the authentication method the partner used to produce it. An RS256-signed token issued after a password-only login provides weak assurance regardless of the signature algorithm.
- The partner should include an
acr(Authentication Context Class Reference) claim in theid_tokenasserting the authentication method used (OIDC Core §2) - VerifiMe strongly recommends phishing-resistant MFA on the partner side (passkey / FIDO2 / PKI-based), consistent with ACSC Essential Eight ML2. Authentication strength is discussed and agreed during the trust review.
- Partners must agree the
acrvalue(s) in use with VerifiMe during onboarding.
Required id_token claims
| Claim | Required | Notes |
|---|---|---|
iss | Yes | Partner's issuer URL; must exactly match the registered value |
sub | Yes | Stable, non-reassignable pseudonymous identifier for the user on the partner's system. Must not be an email address. See Account Identification. |
aud | Yes | Must be VerifiMe's registered client ID for this partner. VerifiMe validates this strictly; tokens issued for other relying parties will be rejected. |
exp | Yes | Token expiry. Maximum 15 minutes from iat (VerifiMe integration policy). Short-lived tokens limit the window for replay attacks. |
iat | Yes | Time the token was issued (OIDC Core §2). VerifiMe tolerates a clock skew of up to 5 minutes. |
nonce | Yes | Required when present in the authorisation request; VerifiMe always sends one. |
acr | Recommended | Authentication Context Class Reference; asserts the authentication method used. Value must be agreed with VerifiMe during onboarding. See Authentication strength above. |
email | Yes | Must be present in the ID Token directly; partner must configure their server to include profile/email claims in the token, not only at the UserInfo endpoint (OIDC Core §5.4) |
given_name | Yes | Same requirement as email |
family_name | Yes | Same requirement as email |
email_verified | No | VerifiMe treats email as verified for approved trusted partners if absent |
Account Identification
During the verification intake, VerifiMe identifies the user using the {iss, sub} pair from the partner IdP token, not the email address. Email addresses can be reassigned by an IdP; {iss, sub} ensures the identity assertion is tied to a specific, stable account on the partner's system. The pair is stored in the verification record for audit and non-repudiation purposes.
- The
subclaim must be stable and non-reassignable within the partner's namespace, and must not be an email address. - Partner SSO is scoped to the verification intake. Once verification is complete, subsequent interactions with VerifiMe use VerifiMe's own session mechanisms. Partner SSO is not available as an ongoing login method.
- If no matching invite is found for the authenticating user, the intake is rejected. If the invite has expired, the intake is also rejected and the partner must re-issue an invite via
POST /v1/user/invite.
What VerifiMe Does Not Support
| Scenario | Why |
|---|---|
| Custom or proprietary auth flows | Reimplements OAuth with less security scrutiny |
| HMAC-signed tokens (HS256) | Shared secret; cannot prove which party signed the token |
| Partner SSO as an ongoing VerifiMe login method | Post-verification sessions are managed by VerifiMe; partner SSO is not involved beyond the intake flow |
| Partner as self-registration path | A partner invite must exist; users cannot initiate verification via partner SSO without one |
| Self-service partner onboarding | Every integration requires VerifiMe engineering work |
| Unverified identity assertion | Partner must meet VerifiMe's security bar before trust is granted |
| Weak authentication on the partner side (SMS OTP, password-only) | The partner's authentication strength is part of the trust chain. A cryptographically signed token produced after a weak authentication provides weak assurance regardless of the signature algorithm. |
Onboarding Checklist
Partner
- Confirm your system calls
POST /v1/user/invitebefore directing a user to VerifiMe for verification. The SSO authentication step will be rejected if no matching invite exists or if the invite has expired. - Confirm integration path (Path A or Path B)
- Provide OIDC discovery endpoint URL (or manual endpoint details)
- Provide JWKS endpoint URL (or PEM public key)
- Confirm
email,given_name,family_nameare included in theid_token(not UserInfo endpoint only) - Confirm
iss,sub,aud,exp,iatare present inid_token - Confirm
nonceis echoed inid_tokenwhen sent in the request - Confirm
stateis echoed unchanged in callback redirect (Path A) - Register VerifiMe's redirect URI with your IdP (Path A); contact your VerifiMe technical contact for the exact value
- Issue a client ID to VerifiMe and confirm client authentication method (Path A)
- (Path B only) Confirm
backchannel_token_delivery_modes_supportedincludespollin discovery document - (Path B only) Implement backchannel authentication endpoint
- (Path B only) Implement push delivery to user
- (Path B only) Confirm token endpoint supports
grant_type=urn:openid:params:grant-type:ciba - (Path B only) Confirm all CIBA error codes are returned:
authorization_pending,slow_down,expired_token,access_denied - Confirm authentication method used and agree
acrvalue(s) with VerifiMe - Confirm
id_tokenis signed with ES256 (preferred) or RS256 (minimum RSA-2048) - Confirm all API endpoints (authorisation, token, JWKS, backchannel) use TLS 1.3 (or minimum TLS 1.2 with forward secrecy)
- Confirm JWKS endpoint is publicly accessible and key rotation procedure is documented
- Confirm
subvalues are stable and non-reassignable; confirmsubis not an email address - Self-certify whether your system processes personal data of EU-resident users (required for DPA scoping)