Complete User Login
curl --request POST \
--url https://api.dfns.io/auth/login \
--header 'Content-Type: application/json' \
--data '
{
"challengeIdentifier": "<string>",
"firstFactor": {
"kind": "Fido2",
"credentialAssertion": {
"credId": "<string>",
"clientData": "<string>",
"signature": "<string>",
"authenticatorData": "<string>",
"algorithm": "<string>",
"userHandle": "<string>"
}
},
"secondFactor": {
"kind": "Fido2",
"credentialAssertion": {
"credId": "<string>",
"clientData": "<string>",
"signature": "<string>",
"authenticatorData": "<string>",
"algorithm": "<string>",
"userHandle": "<string>"
}
}
}
'import requests
url = "https://api.dfns.io/auth/login"
payload = {
"challengeIdentifier": "<string>",
"firstFactor": {
"kind": "Fido2",
"credentialAssertion": {
"credId": "<string>",
"clientData": "<string>",
"signature": "<string>",
"authenticatorData": "<string>",
"algorithm": "<string>",
"userHandle": "<string>"
}
},
"secondFactor": {
"kind": "Fido2",
"credentialAssertion": {
"credId": "<string>",
"clientData": "<string>",
"signature": "<string>",
"authenticatorData": "<string>",
"algorithm": "<string>",
"userHandle": "<string>"
}
}
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
challengeIdentifier: '<string>',
firstFactor: {
kind: 'Fido2',
credentialAssertion: {
credId: '<string>',
clientData: '<string>',
signature: '<string>',
authenticatorData: '<string>',
algorithm: '<string>',
userHandle: '<string>'
}
},
secondFactor: {
kind: 'Fido2',
credentialAssertion: {
credId: '<string>',
clientData: '<string>',
signature: '<string>',
authenticatorData: '<string>',
algorithm: '<string>',
userHandle: '<string>'
}
}
})
};
fetch('https://api.dfns.io/auth/login', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.dfns.io/auth/login",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'challengeIdentifier' => '<string>',
'firstFactor' => [
'kind' => 'Fido2',
'credentialAssertion' => [
'credId' => '<string>',
'clientData' => '<string>',
'signature' => '<string>',
'authenticatorData' => '<string>',
'algorithm' => '<string>',
'userHandle' => '<string>'
]
],
'secondFactor' => [
'kind' => 'Fido2',
'credentialAssertion' => [
'credId' => '<string>',
'clientData' => '<string>',
'signature' => '<string>',
'authenticatorData' => '<string>',
'algorithm' => '<string>',
'userHandle' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.dfns.io/auth/login"
payload := strings.NewReader("{\n \"challengeIdentifier\": \"<string>\",\n \"firstFactor\": {\n \"kind\": \"Fido2\",\n \"credentialAssertion\": {\n \"credId\": \"<string>\",\n \"clientData\": \"<string>\",\n \"signature\": \"<string>\",\n \"authenticatorData\": \"<string>\",\n \"algorithm\": \"<string>\",\n \"userHandle\": \"<string>\"\n }\n },\n \"secondFactor\": {\n \"kind\": \"Fido2\",\n \"credentialAssertion\": {\n \"credId\": \"<string>\",\n \"clientData\": \"<string>\",\n \"signature\": \"<string>\",\n \"authenticatorData\": \"<string>\",\n \"algorithm\": \"<string>\",\n \"userHandle\": \"<string>\"\n }\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.dfns.io/auth/login")
.header("Content-Type", "application/json")
.body("{\n \"challengeIdentifier\": \"<string>\",\n \"firstFactor\": {\n \"kind\": \"Fido2\",\n \"credentialAssertion\": {\n \"credId\": \"<string>\",\n \"clientData\": \"<string>\",\n \"signature\": \"<string>\",\n \"authenticatorData\": \"<string>\",\n \"algorithm\": \"<string>\",\n \"userHandle\": \"<string>\"\n }\n },\n \"secondFactor\": {\n \"kind\": \"Fido2\",\n \"credentialAssertion\": {\n \"credId\": \"<string>\",\n \"clientData\": \"<string>\",\n \"signature\": \"<string>\",\n \"authenticatorData\": \"<string>\",\n \"algorithm\": \"<string>\",\n \"userHandle\": \"<string>\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.dfns.io/auth/login")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"challengeIdentifier\": \"<string>\",\n \"firstFactor\": {\n \"kind\": \"Fido2\",\n \"credentialAssertion\": {\n \"credId\": \"<string>\",\n \"clientData\": \"<string>\",\n \"signature\": \"<string>\",\n \"authenticatorData\": \"<string>\",\n \"algorithm\": \"<string>\",\n \"userHandle\": \"<string>\"\n }\n },\n \"secondFactor\": {\n \"kind\": \"Fido2\",\n \"credentialAssertion\": {\n \"credId\": \"<string>\",\n \"clientData\": \"<string>\",\n \"signature\": \"<string>\",\n \"authenticatorData\": \"<string>\",\n \"algorithm\": \"<string>\",\n \"userHandle\": \"<string>\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"token": "<string>"
}Complete User Login
Completes the login process and provides the authenticated user with their authentication token.
The type of credentials used to login is determined by the kind field in the nested objects (firstFactor and secondFactor). Supported credential kinds are:
Fido2: Login challenge is signed by a user’s signing device usingWebAuthn.Key: Login challenge is signed by a user’s private key.PasswordProtectedKey: Login challenge is signed by the decrypted user’s private key that was sent during the Create Login Challenge step.
POST
/
auth
/
login
Complete User Login
curl --request POST \
--url https://api.dfns.io/auth/login \
--header 'Content-Type: application/json' \
--data '
{
"challengeIdentifier": "<string>",
"firstFactor": {
"kind": "Fido2",
"credentialAssertion": {
"credId": "<string>",
"clientData": "<string>",
"signature": "<string>",
"authenticatorData": "<string>",
"algorithm": "<string>",
"userHandle": "<string>"
}
},
"secondFactor": {
"kind": "Fido2",
"credentialAssertion": {
"credId": "<string>",
"clientData": "<string>",
"signature": "<string>",
"authenticatorData": "<string>",
"algorithm": "<string>",
"userHandle": "<string>"
}
}
}
'import requests
url = "https://api.dfns.io/auth/login"
payload = {
"challengeIdentifier": "<string>",
"firstFactor": {
"kind": "Fido2",
"credentialAssertion": {
"credId": "<string>",
"clientData": "<string>",
"signature": "<string>",
"authenticatorData": "<string>",
"algorithm": "<string>",
"userHandle": "<string>"
}
},
"secondFactor": {
"kind": "Fido2",
"credentialAssertion": {
"credId": "<string>",
"clientData": "<string>",
"signature": "<string>",
"authenticatorData": "<string>",
"algorithm": "<string>",
"userHandle": "<string>"
}
}
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
challengeIdentifier: '<string>',
firstFactor: {
kind: 'Fido2',
credentialAssertion: {
credId: '<string>',
clientData: '<string>',
signature: '<string>',
authenticatorData: '<string>',
algorithm: '<string>',
userHandle: '<string>'
}
},
secondFactor: {
kind: 'Fido2',
credentialAssertion: {
credId: '<string>',
clientData: '<string>',
signature: '<string>',
authenticatorData: '<string>',
algorithm: '<string>',
userHandle: '<string>'
}
}
})
};
fetch('https://api.dfns.io/auth/login', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.dfns.io/auth/login",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'challengeIdentifier' => '<string>',
'firstFactor' => [
'kind' => 'Fido2',
'credentialAssertion' => [
'credId' => '<string>',
'clientData' => '<string>',
'signature' => '<string>',
'authenticatorData' => '<string>',
'algorithm' => '<string>',
'userHandle' => '<string>'
]
],
'secondFactor' => [
'kind' => 'Fido2',
'credentialAssertion' => [
'credId' => '<string>',
'clientData' => '<string>',
'signature' => '<string>',
'authenticatorData' => '<string>',
'algorithm' => '<string>',
'userHandle' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.dfns.io/auth/login"
payload := strings.NewReader("{\n \"challengeIdentifier\": \"<string>\",\n \"firstFactor\": {\n \"kind\": \"Fido2\",\n \"credentialAssertion\": {\n \"credId\": \"<string>\",\n \"clientData\": \"<string>\",\n \"signature\": \"<string>\",\n \"authenticatorData\": \"<string>\",\n \"algorithm\": \"<string>\",\n \"userHandle\": \"<string>\"\n }\n },\n \"secondFactor\": {\n \"kind\": \"Fido2\",\n \"credentialAssertion\": {\n \"credId\": \"<string>\",\n \"clientData\": \"<string>\",\n \"signature\": \"<string>\",\n \"authenticatorData\": \"<string>\",\n \"algorithm\": \"<string>\",\n \"userHandle\": \"<string>\"\n }\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.dfns.io/auth/login")
.header("Content-Type", "application/json")
.body("{\n \"challengeIdentifier\": \"<string>\",\n \"firstFactor\": {\n \"kind\": \"Fido2\",\n \"credentialAssertion\": {\n \"credId\": \"<string>\",\n \"clientData\": \"<string>\",\n \"signature\": \"<string>\",\n \"authenticatorData\": \"<string>\",\n \"algorithm\": \"<string>\",\n \"userHandle\": \"<string>\"\n }\n },\n \"secondFactor\": {\n \"kind\": \"Fido2\",\n \"credentialAssertion\": {\n \"credId\": \"<string>\",\n \"clientData\": \"<string>\",\n \"signature\": \"<string>\",\n \"authenticatorData\": \"<string>\",\n \"algorithm\": \"<string>\",\n \"userHandle\": \"<string>\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.dfns.io/auth/login")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"challengeIdentifier\": \"<string>\",\n \"firstFactor\": {\n \"kind\": \"Fido2\",\n \"credentialAssertion\": {\n \"credId\": \"<string>\",\n \"clientData\": \"<string>\",\n \"signature\": \"<string>\",\n \"authenticatorData\": \"<string>\",\n \"algorithm\": \"<string>\",\n \"userHandle\": \"<string>\"\n }\n },\n \"secondFactor\": {\n \"kind\": \"Fido2\",\n \"credentialAssertion\": {\n \"credId\": \"<string>\",\n \"clientData\": \"<string>\",\n \"signature\": \"<string>\",\n \"authenticatorData\": \"<string>\",\n \"algorithm\": \"<string>\",\n \"userHandle\": \"<string>\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"token": "<string>"
}Authentication
No authentication required.Required Permissions
No authentication required.Body
application/json
Temporary authentication token returned by the Create Challenge endpoint.
First factor credential used to sign the challenge.
- Fido2/Passkeys
- Public/Private key pair
- Password-protected Key
- <Deprecated> Password
Show child attributes
Show child attributes
Second factor credential used to authenticate a user.
- Fido2/Passkeys
- Public/Private key pair
- Password-protected Key
- <Deprecated> TOTP
Show child attributes
Show child attributes
Response
200 - application/json
Success
- Option 1
- Option 2
Authentication token issued to the user.
Last modified on July 23, 2026
Was this page helpful?
⌘I