-
Notifications
You must be signed in to change notification settings - Fork 19
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
API specifikacia #1
Comments
@durasj ono ked ta aplikacia nebezi stale na pozadi, tak by asi nemuselo vadit ani keby sme mali nejaky staticky port nie? Dost by to zjednodusilo pouzivanie clientside, lebo vies okamzite zistit ci to bezi. To by riesilo problem co si mal ty, ze to mal iny user pustene a drzalo to port. |
Ešte skúsme rozlúsknuť tie ďalšie otázky ohľadom api. @pomali máš na to nejaký vyhranený názor? Multipart či json? Ako response dáva zmysel skor json lebo sa stým lepšie robí v js, čiže asi má zmysel to isté robiť aj na vstupe aj keď súbor bude treba nejako encodnut (base64), čo ho nafúkne ale lokálne to vôbec nevadí. @durasj ty to vidíš ako? |
JSON/multipart utility/daemon Protokol pri spustani z browseru |
Mne to vychádza tiež na polling, keď tam nechceme ťahať websockets. Zatiaľ to vidím na nejake api /info /sign pričom to prvé bude polling a vráti aj verziu. Druhé podpíše ak to beží inak to vyvolá spustenie a počká. Ešte máme jeden scenár kde sa môže stať že človek má viac kľúčov na podpisovanie ale to asi zatiaľ neriešime. @durasj ty to ako vidíš s tou kostrou? Aby sme to vedeli prípadne začať plniť implementáciou. Defacto len potrebujeme aby to začalo na nejakom porte počúvať a otváralo okná. Zvyšok už si vieme rozdeliť. |
Websockets ani ti nepomozu na zistenie toho ci uz bezi server. VIacero klucov browser nejako riesi? Tu by mi prislo lepsie, ze ak ma browser nejake poziadavky na to cim to ma byt podpisane tak nech to ide v sign requeste (napr. aky cert, ake meno ma mat ta entita a pod.), a vyber certu robi user podla toho co mu "poradi" appka. |
Ja som 100% za JSON. Multipart form data dava zmysel len na web appkach a mimo toho vseobecne APIs velmi nevidam s multipart form data. Ale samozrejme da sa neskor pridat podpora, ved len budeme respektovat dalsi Content-Type. Base64 nie je problem. Momentalne to uz mam spravene cez JSON a base64. Vedeli by sme akceptovat aj plaintext XML ako to posielaju oni cez WS, ale base64 bude istejsie do buducnosti pre binarne formary nech je to jednotne. Ten overhead prezijeme, ved to ide cez loopback. Co sa tyka tych requestov tak suhlasim s @jsuchal. Tiez to vidim zatial na Co sa tyka pristupu service, tam som popravde proti tomu, lebo:
Ak ide o zrychlenie startu, tak podla mna samostatna appka nabehne dost rychlo a to listovanie klucov a tieto inicializacne veci by sme mohli radsej cacheovat. Ze sa to prednadstavi na to co bolo naposledy a prinajhorsom to zlyha ked clovek medzitym zmenil veci a bude si musiet vybrat znova. Samozrejme da sa ten caching nejak nastavit aj inteligentnejsie. Ale za mna urcite nech sa to proste zapne ked to ma ist a vypne ked sa skonci. |
@jsuchal "Ešte máme jeden scenár kde sa môže stať že človek má viac kľúčov na podpisovanie ale to asi zatiaľ neriešime." Toto nie je problem, pretoze momentalne predselectnem prvy kluc. Ak sa pouzivatelovi nebude pacit tak si vyberie zo zoznamu iny pred stlacenim tlacidal podpisat. EDIT: Respt. to zapametanie ako som pisal vyssie. Ak nebude spravny ten co si pamatame tak si pickne. |
Service som nemyslel tak, ze bude bezat stale, len to ze bude jeden proces ktory prijima requesty a vie zobrazit viacero okien, realne vsak podpisuje iba jeden proces vs to ze sa spusta viacero procesov ktore kazdy riesi podpisovanie samostatne. Oba pripady mozu byt kratko beziace, ci uz ze sa vypnu hned po doruceni podpisaneho dokumentu alebo budu mat grace period ak by si chcel podpisat este nieco v nablizsich 5 minutach, inak sa vypnu. |
Áno, tak ako píše Stano bola moja prvotná predstava. Grace period nám
vyrieši kopec problémov plus hlavne to rieši problém s opakovaným bok. Toto
je pre použitie pri mandatnych certifikátoch dokonca must have. Tam sa
certifikát najprv odblokuje a potom už môžeš podpisovať aj hromadne bez
zadávania.
…On Tue, Apr 6, 2021, 12:17 pomali ***@***.***> wrote:
Service som nemyslel tak, ze bude bezat stale, len to ze bude jeden proces
ktory prijima requesty a vie zobrazit viacero okien, realne vsak podpisuje
iba jeden proces vs to ze sa spusta viacero procesov ktore kazdy riesi
podpisovanie samostatne. Oba pripady mozu byt kratko beziace, ci uz ze sa
vypnu hned po doruceni podpisaneho dokumentu alebo budu mat grace period ak
by si chcel podpisat este nieco v nablizsich 5 minutach, inak sa vypnu.
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
<#1 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/AAAGNZQMPDWVWIDKP4IO3CDTHLNSVANCNFSM42LEWEZA>
.
|
Hmm, na toto veľmi zatiaľ neviem odpovedať, skôr by naivne som povedal že
sa to má zmeniť všade. Lebo hromadný scenár chcem asi podpisovať všade
rovnakym podpisom. Neviem si úplne prestaviť scenár, že by som mal dve
čítačky alebo kľúče a menil to per dokument. Skor si viem predstaviť že
otvorím 10 okien na podpis a potom zistím že mi to prednastavilo zle všade
a budem klikať.
Ešte je tu možnosť, že api vie vrátiť aj zoznam kľúčov a výber bude v gui
na stane konzumenta. Ale skôr si myslím, že to treba vyriešiť takym tým
tlačítkom so šípkou, kde si vyberieš iny certifikát. Alebo úplne separe
tlačítko.
…On Tue, Apr 6, 2021, 12:24 Jakub Duras ***@***.***> wrote:
@pomali <https://github.com/pomali> @jsuchal <https://github.com/jsuchal>
To znie ok, takze by bezal HTTP server a drzal referenciu na token a
private key. Potom akurat je otazka co s tym volenim kluca. Momentalne je v
UI nad podpisovanym suborom. Takze ak by ho clovek zmenil v jednom okne,
mal by sa zmenit v ostatnych alebo sa zmeni len v tomto okne?
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
<#1 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/AAAGNZTOSFPUVA3DVEATGU3THLONBANCNFSM42LEWEZA>
.
|
Okej tak zatial pojdeme zmenou vsade a neskor sa moze pridat do toho dialogu sekundarne tlacidlo "zmenit pre toto okno" ak by sa zistilo, ze ich je viac. To vratenie klucov cez API by som radsej osobne zatial nerobil ak na to nie je poziadavka. Zatial API nevie pustit nic citlive. Ak niekto nieco podvrhne na podpisanie tak to musi clovek explicitne akceptnut podpisanim. Ale ak by sme pridali ten listing klucov tak to uz je nebezpecnejsie. Ak uz bude zoznam vopred nacitany tak to jednoducho dostane utocnik bez toho, ze by to clovek vedel. Tak s tym radsej asi zatial opatrne a implementujme s dobrym premyslenim neskor. Nech sa to deje radsej pred podpisom v GUI ako je to teraz zatial. |
Súhlas, to leakovanie citlivych info som nedomyslel. Toto nechajme na
neskôr.
…On Tue, Apr 6, 2021, 12:38 Jakub Duras ***@***.***> wrote:
Okej tak zatial pojdeme zmenou vsade a neskor sa moze pridat do toho
dialogu sekundarne tlacidlo zmenit pre toto okno ak by sa zistilo, ze ich
je viac.
To vratenie klucov cez API by som radsej osobne zatial nerobil ak na to
nie je poziadavka. Zatial API nevie pustit nic citlive. Ak niekto nieco
podvrhne na podpisanie tak to musi clovek akceptovat. Ale ak by sme pridali
ten listing klucov tak to uz je nebezpecnejsie. Ak uz bude zoznam vopred
nacitany tak to jednoducho dostane utocnik bez toho, ze by to clovek vedel.
Tak s tym radsej asi zatial opatrne a implementujme s dobrym premyslenim
neskor. Nech sa to deje radsej pred podpisom v GUI ako je to teraz zatial.
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
<#1 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/AAAGNZXQG6UXRVHPCNXXJB3THLQBXANCNFSM42LEWEZA>
.
|
@durasj inak da sa mozno spravit taka vec, ze proste kazdy request bude musiet mat v hlavicke nejaky token/uuid ktore sa posle do podpisovaca pri spusteni. To je kvazi csrf nahrada a podpisovac nebude proste odpovedat na requesty, ktore nemaju platny uuid. defacto by to vsak znamenalo este vsetko zabalit do takehoto kontextu, neviem ci si to chceme takto komplikovat. Asi to pre alfa verziu vypustime. |
@jsuchal To som presne rozmyslal a podla mna by to bolo fajn neskor zvazit ako by sa to dalo robit. Ja som chcel (myslim, ze je to aj v popise prototypu ais2 podpisovaca) tiez robit "parovanie" podpisovaca cez ten custom protocol. Potom komunikacia by musela mat HMAC. Pri requestoch z browsera ale co sa tyka hlaviciek bude treba IMHO riesit CORS preflight requesty, takze by som zvazil skor zabalenie body ako header. Ono by to ciastocne riesilo aj MitM, ktory mi teraz pride neprijemny v tom listening server mode. Problem s tymto pristupom je ale ked si clovek spusti aplikaciu manualne - tj. nie cez custom protocol. Taktiez to co si spominal - aby to fungovalo spustene viackrat tak treba nejaky "kontext" na oboch stranach. |
@durasj podla mna nejakemu lahkemu JS wrapperu sa nevyhneme, cize tam uz ci si on ulozi do localstorage/cookie nejaky port alebo uuid je jedno. |
@jsuchal Jop, ono by to az tak veci nemuselo komplikovat. Len to manualne otvorenie aplikacie - nie cez custom protocol - by mohlo komplikovat. Potom by sa musel vediet vyplnit v appke manualne ten pairing key ak by to bolo vyzadovane. Situaciu na ktoru myslim ked spominam manualne otvorenie mimo protokol je ked custom protocol by z nejakeho dovodu nefungoval. Da sa to samozrejme urobit volitelne, ze ked je zapnuta s, tak ho vyzaduje, ak bez, tak nevyzaduje. Akurat to trocha defeatne purpose. |
Ono situaciu, ze si niekto pusti aplikaciu len tak by som asi neriesil. Preco by to vlastne niekto robil? |
@jsuchal Pre situaciu co som spomenul. Nefunguje z nejakeho dovodu custom protocol. Napr. na Windowse ked sa presunie aplikacia alebo zmeni zaznam v registroch, alebo ked si omylom pouzivatel odmietne otvorenie aplikacie a potom sa nevie dopracovat spat k povoleniu. Intuitivna akcia podla mna bude otvorit si aplikaciu manualne. V tom pripade by sla na default porte a jednoducho by to slo lebo client by vedel ceknut default port najprv. |
D.Signer sa inak tiez neda pustit len tak a neviem o tom, ze by to vadilo. |
Okej, asi to teda zatial zbytocne komplikujem pokrytim toho edgecasu. Tak potom tie nastavenia pri spusteni custom protocolom mozu vyzerat takto?
Ten posledny argument je povoleny origin, ktory by sa dal do CORS hlavicky, takze browser nedovoli ani strkat do toho nos inym strankam ako ta co to spustila. Predpokladame, ze launch cez protokol je secure channel. HTTP uz nie a nemusi vdaka HMAC lebo key sa z toho snoopnut neda. |
CORS je fajn napad, HMAC ako optional tiez. |
Len pre info. dohodli sme sa @durasj, ze swagger spravi on. |
API specifikacia je done na https://whitelabel.octosign.com/server-api Je v repozitari spolu s appkou. Po spusteni appky sa tiez hostuje lokalne na Spravil som JS klienta, ktoru ju implementuje. @pomali ma invite. Na npm nie je zatial publishnuta lebo sa to musi najprv dostat do polostabilneho stavu. Verejna dokumentacia je na stranke kde je aj Server HTTP API dokumentacia. JS klient ukazuje ako sa to da spravit bez triggovania CORS preflight. Funguje to v pohode na Chrome, Firefox, Edge(ium) aj zo secure origin. Safari nefunguje pre mixed content - ak je stranka na HTTPS a robi request na HTTP localhost tak sa WebKit z toho posklada. Toto by tak nemalo byt a maju bug na ktorom aktivne pracuju ale aj tak to tak skoro teda asi nebude. Loopback by mal byt safe podla specky a ostatni to dodrziavaju ale Safari nie. Riesenie je skarede - self-signed cert + dns rule ako spominal hore @pomali ale tym sa zasahuje do setupu pouzivatela. Osobne nemam motivaciu to pridavat. Planujem len eventualne pridat podporu HTTPS a klient je uz teraz konfigurovatelny. Maly sneak peek z klienta kym otvorite: import { apiClient } from '@octosign/client';
const client = apiClient();
// Launch URL that should be used by user to launch the signer application
console.log(client.getLaunchURL());
await client.waitForStatus('READY');
const content =
'<?xml version="1.0"?><Document><Title>Lorem Ipsum</Title></Document>';
console.log(await client.sign({ content }));
// => { content: '<?xml version="1.0"?><Document><Title>Lorem Ipsum</Title>...</Document>' } |
Toto je ale showstopper pre MAC nie? |
@jsuchal Je to showstopper len pre macOS + Safari kombinaciu. Chrome, Firefox, Edge su fajn na macOS. EDIT: Este vlastne k tomu co to znamena. Pre Safari by sa to dalo spravit docasne dvojkrokovo - 1. povedat pouzivatelovi, ze nech pls pouzije iny browser 2. dat mu kroky manualne pridat ten cert/nechat spustit dodatocny script a na strane implemnetacie (nie mojho clienta) spravit |
Pridat certifikat pri instalacii na strane klienta pre Mac mi nepride nejaka ohavnost. DNS - toto asi neviem od pasa posudit, ci ist stylom D.Signeru je nejaky problem. DNS zaznam vyrobit viem v pohode aj s certifikatom :) |
Tu diskutujeme ako bude fungovat API:
Zatial je zhoda, ze to bude fungovat nejako takto:
Pre slovenske xml, potrebujeme na vstup poslat: XML subor, XSLT podpisovu transformaciu, XSD schemu validacie. Toto sa musi (!) poslat na podpisovac, aby niekto nepodvrhol inu transformaciu. Z tohto sa vyrobi v podpisovaci slovensky "datacontainer", ktory sa podpisuje.
Otvorene otazky postrehy, ktore maju dosah na architekturu/api:
sk-signing
, ktory by nastavil vsetko ako treba, pripadne ked sa situacia v buducnosti zmeni nemusel to konzument podpisovaca sledovat. Jednoducho bude pouzivatsk-signing
template vo svojej aplikacii.Bolo by dobre vytvorit nejake swagger API, ked si povieme ake endpointy ako budu fungovat. Voci nim sa potom daju robit mocks na extensions aj na portali.
The text was updated successfully, but these errors were encountered: