The signing flow authenticates a previously registered user by prompting them to satisfy their stored FIDO2 passkey — typically via Face ID or device biometrics — and returns an ES512-signed JWT along with aDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/signing-sdk/face-auth-ios/llms.txt
Use this file to discover all available pages before exploring further.
requestId. Your backend verifies the JWT using the ES512 public key to confirm the user’s identity before accepting the signing action.
What signing does
- Passkey authentication — the SDK locates the credential stored during registration (bound to your
rpId) and asks the OS to authorize it via Face ID or device unlock. - JWT issuance — once the passkey challenge is satisfied, the backend issues an ES512-signed JWT containing the user’s identity claim.
- Result delivery — your completion handler receives both the
jwtstring and arequestIdyou can use for audit purposes.
Required inputs
| Parameter | Type | Description |
|---|---|---|
bankId | String | Must match the identifier used at registration exactly. |
dto | [String: String] | Optional extra fields (e.g. ["otp": otp]). Pass [:] if unused. |
config | TadSigningConfig | Same TadSigningConfig instance used for registration. |
mode | TadSigningMode | Must be .sign for the signing flow. |
Presenting the view controller
Build the dto payload
Construct the optional dictionary. Include an OTP when your flow requires a second factor alongside the passkey.
Instantiate TadSigningViewController in .sign mode
Create the view controller with
mode: .sign. The bankId must be the same value supplied during registration — the SDK uses it to locate the correct passkey.Resolve the top view controller
Walk the presentation chain to find the currently active
UIViewController.Handling the result
On success, bothjwt and requestId are populated. The demo app displays them together:
jwt to your backend for verification. The requestId can be stored alongside the signing event for auditing.
Difference from registration
Registration (.register) | Signing (.sign) | |
|---|---|---|
| Face liveness check | Yes | No — passkey satisfies authentication |
| Passkey created | Yes | No — existing passkey is used |
jwt in result | Empty string | Populated ES512-signed JWT |
requestId in result | Populated | Populated |
Permissions
Because the signing flow uses the device’s stored passkey rather than the camera, no camera permission is required. Face ID is invoked by the OS as part of passkey authorization and uses the existingNSFaceIDUsageDescription key you declared during setup: