Approve flow
Table of contents
Overview
The basic and most dynamic flows consists of the swipe/approve flows where an authentication request is displayed in the SoloID Authenticator app with the name and logo of the requesting service alongside an optionally text bound to the flow. The user can then either approve by swiping the approve button slider in the bottom of the app, or reject the flow.
Options:
- Push notifications: It is possible to trigger push notifications when starting a flow to targeted devices.
- Channel-binding: Require the approving device to scan a generated QR code or transfer the generated code using appswitch (same device) - automatically supported when using the iframe setup.
- Choice of authentication strength: one or two factor (NIST AAL level 1 or 2, NSIS level low and substantial). Two factor triggers requirement for biometric approval.
- Request and require eID binding to device: Dynamically handled by app and backend for users.
- eID flow: Option to force an eID approval, i.e. trigger flow from app that starts a secure eID flow handled by the SoloID Authenticator app and backend.
- Appswitch options: Options for controlling and specifying appswitch behavior for better UX.
To initiate an approve flow, utilize the flow API endpoint
API integration
POST api/sp/v2/flow
Here as cURL towards the PP environment
curl --location 'https://pp.soloid.dk/api/sp/v2/flow' \
--header 'Content-Type: application/json' \
--header 'Accept: text/plain' \
--header 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjA...VB8szDy5V3H8usgIqDUHVBOeHh232Xn5PAAVQXJZ35qPJNg' \
--data '{
"approveText": "Approve flow 😉"
}'
The flow API endpoint will take the following parameters:
| Parameter | Description | Default |
|---|---|---|
| deviceList | Specifies one or more devices by AppIDs or by an unique eID identifier | null |
| approveFlowType | One of [“StepUp”, “Authenticate”] | “StepUp” |
| requestedIdp | If set, must be a supported IDP like “MitID” | “None” |
| approveText | Text to show user in app. 130 characters length limit. | null |
| channelBindingOption | Specifies channel-binding behavior. One of [“None”, “Required”] | “None” |
| appSwitchUrlOnCompleted | Specifies an URL for which the SoloID Authenticator should redirect the user when the flow has completed | null |
Approve flow type
The approveFlowType parameter specifies one of
- “StepUp”: 1-factor authentication. Sends push notifications. No biometric unlock required in app, only swipe inside app.
- “Authenticate”: 2-factor authentication: Does not send push notifications. Biometric unlock required in app, for each approval.
Approve text
The approveText parameter is highly recommended to utilize for each SoloID Authenticator flow and will enable the service to present a short and specific context specific text to the approving user, helping to improve user awareness and improve flow security.
RequestedIdp
The requestedIdp parameter enables the service to initiate a SoloID Authenticator flow requiring the user to have the specified eID bound to the approving SoloID Authenticator device. On success, return the eID global identifier to the service.
The binding of the requested IDP to the device is handled automatically by the SoloID Authenticator and will only trigger for devices for which no previous binding for the requested IDP has been done. The user will have control on whether to accept the binding and is will be presented with an inline consent when approving to hand-out the specific eID identifier to the requesting service.
Channel-binding options
SoloID Authenticator supports the requirement for channel-binding for approve flows. This requirement will enforce that the approving device either scan a SoloID Authenticator flow QR code with the in-app QR scanner or that the app is initiated with a specific appswitch containing the channel-binding identifier for the flow. This increases the probability that the approving app is near (QR) or on the same device (appswitch) as the browser/app/screen used to display the QR or from which the appswitch was initiated.
Poll result
A CORS and JavaScript enabled polling enpoint is available at
GET /api/sp/v2/poll/[:flowId]
As cURL example towards PP
curl --location 'https://pp.soloid.dk/api/sp/v2/poll/<flowId>' \
--header 'Accept: text/plain' \
--header 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsIm...8szDy5V3H8usgIqDUHVBOeHh232Xn5PAAVQXJZ35qPJNg' \
This will enable to continuously poll the general state of a flow and is also used by the SoloID Authenticator iframe for checking the current flowstate.
The poll endpoint returns a result on the form
{
"flowState": "Pending"
}
Where flowState is one of
[ Invalid, Pending, Approved, Rejected, Expired ]
When the flow is completed, the result can be retrieved by your backend calling the flow result API endpoint:
GET api/sp/v2/flow/[:flowId]
As cURL towards PP
curl --location 'https://pp.soloid.dk/api/sp/v2/flow/<flowId>' \
--header 'Accept: text/plain' \
--header 'Authorization: Bearer eyJhbGciOiJSUzI1NiIs...uCV9qVB8szDy5V3H8usgIqDUHVBOeHh232Xn5PAAVQXJZ35qPJNg' \
The result will contain the following structure:
{
"flowId": "string",
"flowState": flowState,
"appId": "string",
"idp": "string",
"idpIdentityId": "string"
}
| Parameter | Description | In result (Always, Optional) |
|---|---|---|
| flowId | FlowID of flow | Always |
| flowState | [ Invalid, Pending, Approved, Rejected, Expired ] | Always |
| appId | SoloID Authenticator device AppID | Always |
| idp | IDP identifier, if requested | Optional |
| idpIdentityId | IDP ID identifier, if idp is set | Optional |