Synchronní podepisování souborů
Krok č. 1) Přihlášení
Pro přístup k API je nutné nejprve získat přístupový token pomocí koncového bodu pro přihlášení externího informačního systému pod identitou konkrétního uživatele.
Koncový bod: /api/sofa/v1/auth/extis/login-impersonate
Metoda: POST
Hlavičky:
-
Accept: application/json
-
Content-Type: application/json
Parametry:
-
login … uživatelské jméno externího informačního systému.
-
password … heslo externího informačního systému.
-
impersonateUserId … LDAP identifikátor uživatele, jehož identitou má externí informační systém vystupovat (návod na zjištění tohoto identifikátoru je uveden na konci dokumentu).
Příklad:
POST /api/sofa/v1/auth/extis/login-impersonate HTTP/1.1
Host: sofaws.602.cz
Accept: application/json
Content-Length: …
Content-Type: application/json
{
"login": "48a0ecdd540849f0af416307406467f0",
"password": "wau3S99vx2d_NW2P",
"impersonateUserId": "9e5f2f76-fff5-44c3-b943-06a95fdc08e2"
}
Výsledek:
{
"token": "eyJhbGciOiJBMjU2…"
}
Krok č. 2) Nahrání souborů
V dalším kroku je nutné nahrát dokumenty jeden po druhém do výchozího úložiště (default) pomocí koncového bodu File API. Výsledkem bude seznam identifikátorů souborů použitý v dalším kroku.
Koncový bod: /api/sofa/v2/file?storeId=default
Metoda: POST
Hlavičky:
-
Accept: application/json
-
Authorization: Bearer <token>
-
Content-Type: multipart/form-data
Parametry:
-
file … soubor dokumentu (ve verzi 2.0 se již nepoužívá hlavička FileId s parametry kódovanými ve formátu JSON, ale přenáší se standardní cestou pro upload souborů podle RFC 2854, tzn. že se název souboru uvádí v hlavičce Content-Disposition, velikost souboru v hlavičce Content-Length a typ souboru v hlavičce Content-Type).
Příklad:
POST /api/sofa/v2/file?storeId=default HTTP/1.1
Host: sofaws.602.cz
Accept: application/json
Authorization: Bearer eyJhbGciOiJBMjU2…
Content-Length: …
Content-Type: multipart/form-data; boundary="-----086735ab-f408-405e-9628-4eb525d56d71"
-------086735ab-f408-405e-9628-4eb525d56d71
Content-Disposition: form-data; name="file"; filename="Document.pdf"
Content-Length: …
Content-Type: application/pdf
…binary file content…
-------086735ab-f408-405e-9628-4eb525d56d71--
Výsledek:
{
"fileId": "eyJhbGciOiJIUzI1…"
}
Krok č. 3) Spuštění GraphQL mutace
Pro podepisování dokumentů je nutné zavolat koncový bod GraphQL API s mutací pro podepisování souborů, které předáme identifikátor dokumentu a parametry podepisování. Výsledkem je identifikátor dokumentu opatřeného podpisem. Aktuálně jsou podporované následující parametry:
-
algorithmId … identifikátor algoritmu, např. SHA-256 nebo SHA-512 (výchozí hodnota: SHA-256).
-
certificateId … identifikátor certifikátu (HSM ID).
-
certificatePIN … PIN certifikátu.
-
sealParameters
-
addTimestamp … příznak vložení časového razítka.
-
addVisualSignature … příznak doplnění vizuálního podpisu.
-
showParaphImage … příznak zobrazení obrázku parafy.
-
reason … důvod podpisu.
-
location … umístění.
-
contact … kontakt.
-
parametry vizuálního podpisu, pouze pokud addVisualSignature = true:
Umístění:
-
page … číslo stránky počítáno od začátku dokumentu (kladná hodnota), respektive od konce dokumentu (záporná hodnota).
-
posX … souřadnice levého okraje vizuálního podpisu v rozlišení 72 DPI.
-
posY … souřadnice horního okraje vizuálního podpisu v rozlišení 72 DPI od dolního okraje stránky (kladná hodnota), respektive od horního okraje stránky (záporná hodnota).
-
sizeX … šířka vizuálního podpisu v rozlišení 72 DPI.
-
sizeY … výška vizuálního podpisu v rozlišení 72 DPI.
Text:
-
text … text vizuálního podpisu.
-
textHeader … textová hlavička vizuálního podpisu.
Obrázek:
-
image … obrázek vizuálního podpisu (Base-64 kódovaný PNG soubor).
-
-
-
signingProperties
-
signerName … jméno podepisujícího.
-
signerPhoneNumber … telefonní číslo podepisujícího.
-
signatureAutoLocationWidth … šířka automatického umístění vizuálního podpisu.
-
signatureAutoLocationHeight … výška automatického umístění vizuálního podpisu.
-
signatureAutoLocationSearchText … text automatického umístění vizuálního podpisu.
-
Koncový bod: /api/sofa/v1/graphql
Metoda: POST
Hlavičky:
-
Accept: application/json
-
Authorization: Bearer <token>
-
Content-Type: application/json
GraphQL operace:
mutation signFile($file: SignOperationParameters!) {
signing {
signFile(file: $file)
}
}
Příklad:
POST /api/sofa/v1/graphql HTTP/1.1
Host: sofaws.602.cz
Accept: application/json
Authorization: Bearer eyJhbGciOiJBMjU2…
Content-Length: …
Content-Type: application/json
{
"operationName": "signFile",
"query": "mutation signFile(\n $file: …",
"variables": {
"file": {
"fileId": "eyJhbGciOiJIUzI1…",
"algorithmId": null,
"certificateId": "3fbc87f3-f5fb-4211-934a-881b76ca52b6-x3x",
"certificatePIN": "12345",
"sealParameters": {
"addTimestamp": true,
"addVisualSignature": true,
"showParaphImage": true,
"reason": null,
"location": null,
"contact": null,
"page": 1,
"posX": 10,
"posY": -10,
"sizeX": 250,
"sizeY": 50,
"text": "Text podpisu",
"textHeader": null,
"image": null
},
"signingProperties": {
"signerName": "Test",
"signerPhoneNumber": "Test",
"signatureAutoLocationWidth": null,
"signatureAutoLocationHeight": null,
"signatureAutoLocationSearchText": null
}
}
}
}
Výsledek:
{
"data": {
"signing": {
"signFile": "eyJhbGciOiJIUzI1…"
}
}
}
Důležité poznámky:
-
Pro podepisování lokálními certifikáty je nutné využít služby podepisování pomocí formuláře.
-
PIN certifikátu je z bezpečnostních důvodů nutné vždy zadávat do proměnných (variables).
-
Na rozdíl od pečetění jsou některé parametry načítány z konfigurace podepisujícího (impersonovaného) uživatele, konkrétně se jedná o parametry: text, textHeader a image, takže je není nutné zadávat; pokud jsou uvedeny, mají vyšší prioritu před hodnotami načtenými z konfigurace.
-
Pro umístění vizuálního podpisu je možné využít služby automatického umístění na základě vyhledaného textu, případně ještě doplněné o šířku a výšku; v tomto případě není nutné zadávat poziční parametry: page, posX, posY, sizeX a sizeY, jelikož budou nahrazeny automaticky vypočítanými hodnotami.
Pro zjištění seznamu certifikátů lze použít následující GraphQL dotazy, resp. jejich upravené verze:
GraphQL operace:
query getCertificates(
$isDeleted: Boolean! = false
$isExpired: Boolean! = false
$isRevoked: Boolean! = false
) {
certificates {
certificates(
where: {
and: [
{ sys: { isDeleted: $isDeleted } }
{ sys: { isExpired: $isExpired } }
{ sys: { isRevoked: $isRevoked } }
]
}
) {
edges {
node {
id
hsmId
subject
certificateName
serialNumber
isDeleted
isExpired
isRevoked
user {
id
userName
completeName
}
}
}
}
}
}
GraphQL operace:
query getCertificatesForUser(
$userId: String!
$isDeleted: Boolean! = false
$isExpired: Boolean! = false
$isRevoked: Boolean! = false
) {
certificates {
certificates(
where: {
and: [
{ eqString: { left: { sys: USER_ID }, right: { const: $userId } } }
{ sys: { isDeleted: $isDeleted } }
{ sys: { isExpired: $isExpired } }
{ sys: { isRevoked: $isRevoked } }
]
}
) {
edges {
node {
id
hsmId
subject
certificateName
serialNumber
isDeleted
isExpired
isRevoked
}
}
}
}
}
Krok č. 4) Stažení souborů
Posledním krokem je stažení podepsaných souborů jeden po druhém pomocí koncového bodu File API:
Koncový bod: /api/sofa/v2/file
Metoda: GET
Hlavičky:
-
Authorization: Bearer <token>
Parametry:
-
fileId … identifikátor stahovaného dokumentu.
Příklad:
GET /api/sofa/v2/file?fileId=eyJhbGciOiJIUzI1…
Host: sofaws.602.cz
Authorization: Bearer eyJhbGciOiJBMjU2…
Výsledek:
Výsledkem je stahovaný dokument.
Název souboru lze získat buď standardně z hlavičky Content-Disposition, nebo File API v2 nastavuje pro snazší zpracování hlavičku X-Sofa-FileName. |