WklGatewayClient – razred VBA za podatkovni prehod
WklGatewayClient omogoča, da ukaze vmesnika za upravljanje podatkovnega prehoda (Wkl.Data.Gateway) kličete
iz VBA: izdajo ključev, nastavitev 2FA (dvostopenjsko preverjanje identitete), preverjanje povezave in druge. Hkrati je
predloga za vsako aplikacijo VBA, ki s prehodom komunicira prek HTTP.
Sezname (vire podatkov, pravila, osebe, ključe) aplikacija Access bere in ureja kot povezane tabele prek gonilnika ODBC prehoda. Kar vrne ključ ali drugo zaupno vrednost ali vpliva na več kot eno vrstico, je ukaz, in za ukaze je namenjen ta razred. Množice entitet in ukaze opisuje HTTP: skrbništvo (dokumentacija podatkovnega prehoda).
Podprto okolje
Microsoft Access iz Microsoft 365 v 32- in 64-bitni različici, v datoteki ACCDB, v datoteki ACCDE in v okolju Access Runtime. Aplikacija za upravljanje svoje ukaze kliče prek tega razreda.
Predpogoji
| Predpogoj | Za kaj |
|---|---|
| Microsoft Access iz Microsoft 365, 32- ali 64-bitna različica | glejte Podprto okolje |
sklic na WKL Office JSON 1.1 (Wkl.Office.JSON.dll, registriran v 32- ali 64-bitni različici, ki ustreza vašemu Officeu; do izdaje 1.0.3 WKL Access JSON 1.0 z Wkl.Access.JSON.dll) | razčlenjevanje odgovorov v JDoc in sestavljanje zahtev |
WinHTTP (WinHttp.WinHttpRequest.5.1, del sistema Windows) | HTTP; uporablja se s poznim vezanjem, zato sklic ni potreben |
modul razreda StringBuilder (StringBuilder.cls, v skladišču pod source/classes/) | sestavljanje besedila iz več delov (glave, Base64, kodiranje URL) |
prehod s skrbniško shrambo in oseba s pravico admin | ukazi |
Vključitev v projekt
- V urejevalniku VBA izberite File > Import File in uvozite
WklGatewayClient.clsinStringBuilder.cls(modula razreda, v skladišču podsource/classes/); če želite primere, uvozite šeWklGatewayClientExamples.bas(podclient/). Če projekt modul razredaStringBuilderže ima, te datoteke ne uvozite. - Izberite Tools > References in označite „WKL Office JSON 1.1“ (do izdaje 1.0.3 „WKL Access JSON 1.0“).
- Prevedite projekt (Debug > Compile).
Meniji so navedeni tako, kot jih prikazuje urejevalnik VBA v slovenskem Officeu, torej v angleščini; v nemškem Officeu se imenujejo Datei > Datei importieren, Extras > Verweise in Debuggen > Kompilieren.
Datoteki sta v obliki, ki jo urejevalnik VBA izvaža in uvaža. LoadFromText v Accessu za modul
razreda pričakuje drugačno obliko (brez VERSION 1.0 CLASS … END in brez VB_Name); če prejme
izvozno obliko, namesto modula razreda ustvari standardni modul. Kako eno obliko pretvorite v drugo,
prikazuje client\tests\Run-AccessTests.ps1.
Uporaba
Za celotno sejo aplikacije uporabljajte en sam primerek razreda, ker ta hrani sejo 2FA.
Private m_Client As WklGatewayClient Public Function Gateway() As WklGatewayClient If m_Client Is Nothing Then Set m_Client = New WklGatewayClient m_Client.BaseUrl = "https://podatki.example.com" m_Client.SignIn = gwPersonalKey ' Key from Windows Credential Manager End If Set Gateway = m_Client End Function Sub Example() Dim answer As JDoc On Error GoTo ErrorHandler Set answer = Gateway().IssueKey("Ana Novak", Label:="Prenosnik", Delivery:="link") Debug.Print answer.GetString("$.link") GoTo FinalHandler ErrorHandler: MsgBox Err.Description, vbExclamation ' Error numbers: see section "Napake" Resume FinalHandler FinalHandler: Set answer = Nothing End Sub
Komentarji v kodi so, kot je pri kodi običajno, v angleščini: ključ se prebere iz upravitelja poverilnic Windows, številke napak pa so navedene v razdelku Napake.
WklGatewayClientExamples.bas vsebuje vsak ukaz po enkrat, z obravnavo napak po številki.
Prijava
SignIn | Prvi faktor | Vir |
|---|---|---|
gwPersonalKey (privzeto) | osebni ključ (wkl_…) v glavi X-Api-Key | lastnost Key, sicer upravitelj poverilnic Windows (StoreKey, ForgetKey, HasStoredKey) |
gwWindows | račun Windows, pod katerim teče proces (Negotiate) | – |
gwSqlLogin | prijava SQL (HTTP Basic) | UserName, Password |
gwServiceKey | ključ storitve | spremenljivka okolja, ki jo navaja KeyVariable |
Vsako prijavo (osebni ključ, ključ storitve, geslo in račun Windows) razred pošlje samo prek https
ali lokalnemu računalniku; naslov http drugega računalnika zavrne z gwErrConfiguration, še
preden kar koli pošlje. StoreKey ključ
shrani pod istim ciljem, ki ga gonilnik ODBC uporablja za povezavo za upravljanje na isti naslov
(Wkl.Data.OData.Odbc:(persönlicher Schlüssel)@<BaseUrl>/admin/v1/odata/), zato en shranjeni ključ
služi tako povezanim tabelam kot razredu. V datoteki podatkovne zbirke ključ ni nikoli shranjen.
2FA
Če prehod zahteva 2FA (odgovor 401 z glavo Wkl-Totp), razred pridobi kodo, jo zamenja
za sejo in zahtevo ponovi. Kodo pridobi iz teh virov, v tem vrstnem redu:
- iz lastnosti
TotpCode(uporabi se enkrat), za kodo VBA, ki kodo za prijavo pridobi sama; - iz dogodka
CodeRequired(Message, Code, Cancel)primerka, deklariranega zWithEvents; - iz okna
InputBox(deluje tudi v okolju Access Runtime), ki ga izklopite zAskWithInputBox = False.
Če je koda napačna, razred s sporočilom prehoda vpraša znova, največ trikrat. OpenSession sejo
izrecno odpre, ForgetSession jo zavrže. Gonilnik ODBC ima svojo sejo. Da ena koda zadošča za oba,
aplikacija gonilniku preda SessionToken s ključno besedo SESSION= v povezavi, ki jo odpre sama
(tako dela aplikacija za upravljanje). Brez te predaje gonilnik in razred kodo
zahtevata vsak posebej.
Prekinjena povezava
Če se povezava prekine brez odgovora, razred zahtevo ponovi po 1 sekundi in nato še po 3 sekundah.
Vsaka zahteva za pisanje nosi glavo Idempotency-Key, prehod pa na ponovitev odgovori z že
pripravljenim odgovorom, namesto da bi pisal drugič. Ključ si prehod zapomni za 10 minut in samo
v pomnilniku: če se med prekinitvijo in ponovitvijo znova zažene, se zahteva lahko izvede dvakrat
(vedenje prehoda, kot ga opisuje HTTP: skrbništvo, razdelek „Veliko dejanj naenkrat“ (dokumentacija
podatkovnega prehoda)). Zahteva, pri kateri poteče časovna omejitev (TimeoutSeconds, privzeto 60),
se ne ponovi: prehod jo morda še izvede, razred pa tega ne more vedeti. V tem primeru podatke
preberite znova in preverite, ali je bila sprememba uveljavljena.
Kaj razred ščiti in česa ne
- Ključe, gesla in prijavo Windows pošilja samo prek HTTPS ali lokalnemu računalniku; sicer zahtevo zavrne z napako
gwErrConfiguration. WinHTTP potrdilo strežnika preveri v shrambi potrdil Windows; pri neveljavnem potrdilu zahteva ne uspe. Razred tega preverjanja nikoli ne izklopi. KeyinPasswordhrani samo v pomnilniku svojega primerka. Ključ se shrani samo, če pokličeteStoreKey, in še to samo v uporabnikovem upravitelju poverilnic Windows.- Ključ storitve (
gwServiceKey) se nikoli ne shrani v kodo ali podatkovno zbirko. Razred ga med izvajanjem prebere iz spremenljivke okolja, ki jo navajaKeyVariable. Kdor lahko bere to spremenljivko (vsak proces, ki teče pod tem uporabnikom), ima ključ.
Člani
| Član | Opis |
|---|---|
BaseUrl | naslov prehoda: shema, gostitelj in vrata, brez poti |
SignIn, Key, KeyVariable, UserName, Password | prijava; glejte zgoraj |
TotpCode, AskWithInputBox, CodeRequired | 2FA |
TimeoutSeconds | časovna omejitev posamezne zahteve v sekundah |
LastStatus, LastMessage | stanje HTTP in sporočilo zadnjega odgovora |
HasSession, SessionExpiresAt, OpenSession, ForgetSession | seja 2FA |
SessionToken | žeton seje za predajo gonilniku ODBC v istem procesu (SESSION=); hranite ga samo v pomnilniku |
CredentialTarget, StoreKey, ForgetKey, HasStoredKey | ključ v upravitelju poverilnic Windows. ForgetKey in HasStoredKey vrneta False samo, kadar ključ ni shranjen; če ne uspe sam upravitelj poverilnic, oba sprožita gwErrConfiguration |
IssueKey(Person, [Label], [ExpiresAt], [ReadOnly], [Databases], [FromNetworks], [ExceptNetworks], [TotpExempt], [Delivery], [OnDemand]) | izda ključ; Delivery je link (privzeto) ali key; OnDemand pomeni, da ključ miruje do aktivacije. Pri key je ključ v odgovoru kot navadno besedilo in s tem v vaši kodi VBA: nikoli ga ne prikažite, ne shranite in ne zapišite v dnevnik. Aplikacija za upravljanje zato uporablja samo link |
ActivateKey(KeyId, Hours) / DeactivateKey(KeyId) | aktivira ključ na zahtevo za Hours ur oziroma ga takoj znova postavi v mirovanje; glejte HTTP: prijava, razdelek „Ključi na zahtevo“ (dokumentacija podatkovnega prehoda) |
ExplainSignIn(Person, OriginNames, OriginAddresses, [Scope], [OriginCountries], [OriginOperators], [OriginClients], [OriginTimes]) | kaj pravilnik za prijavo določa za osebo po načinu prijave in izvoru, skupaj s pravili, ki to določajo (rules), pravili v preizkusu (tried) in pravili, ki jih izjema razveljavi (spared); prazen naslov pomeni neznan izvor. Polja za državo (TH), ponudnika internetnih storitev (AS3320), program in čas (UTC) za posamezni izvor omogočajo vprašanje „kaj bi veljalo, če …“; če so prazna, jih prehod ugotovi sam |
SignInProfile(Person, [Days]) | kaj je za osebo pri prijavi običajno v zadnjih Days dneh (od 1 do 3650, privzeto 90): total, activeDays in pod dimensions vrednosti po državah, omrežjih, ponudnikih internetnih storitev, programih, načinih prijave in urah s številom ter prvim in zadnjim dnem. Upoštevane so samo uspešne prijave; zahteva pravico sign-in-events (sicer 403), neznana oseba vrne 404 |
SaveSignInRule(Id, Scope, Method, Effect, Label, [FromNetworks], [ExceptNetworks], [Persons], [ExceptPersons], [WindowsGroups], [ExceptWindowsGroups], [Countries], [ExceptCountries], [Operators], [ExceptOperators], [Clients], [ExceptClients], [Hours], [ExceptHours], [Exceptions], [Mode]) | v eni spremembi ustvari pravilo za prijavo z vsemi pogoji in izjemami (Id 0) ali ga v celoti zamenja; vsak izpuščeni seznam je zato po klicu prazen, brez Mode pa je pravilo uveljavljeno. Seznami za vključitev in izključitev: omrežja, osebe (po imenu), skupine Windows, države, ponudniki internetnih storitev, programi, časovna okna; prazen seznam oseb pomeni „vsak klicatelj“. Exceptions: polje objektov Scripting.Dictionary s seznami persons, windowsGroups, countries, from, operators, clients, hours, koncem until (Date v UTC) in label. Mode: Enforce ali Report (samo preizkus). Odgovor: id |
EnrollTotp(Person, [Delivery]), ResetTotp(Person) | nastavi oziroma odstrani 2FA |
OwnKeys([DataSource]), IssueOwnKey([Label], [ExpiresAt], [ReadOnly], [Databases], [DataSource]), RevokeOwnKey(Id, [DataSource]) | navede, izda (odgovor key, prikazan enkrat) in prekliče lastne ključe; glejte HTTP: prijava, razdelek „Samopostrežba“ (dokumentacija podatkovnega prehoda). Zahteva prijavo z gwWindows ali gwSqlLogin; pri prijavi SQL DataSource navede vir podatkov, pri katerem se prijava preveri |
TestConnection(DataSource), ReloadCatalog([DataSource]) | preveri vir podatkov (odgovor reachable, ob neuspehu še message, number in failure, vrsta napake, neodvisna od jezika strežnika); zavrže predpomnjeni katalog |
ServiceAccount() | račun, s katerim se prehod pri prijavi Windows prijavlja v podatkovne zbirke: account (kot ga vidi SQL Server na istem računalniku), networkAccount (na drugem računalniku), kind, domain – ime, za katero skrbnik podatkovne zbirke ustvari prijavo |
SetGeoIpSource(Source, UpdateDays, [Account], [LicenseKey], [RemoveLicenseKey]) | izbere vir geolokacijske zbirke: none, dbip-lite ali maxmind (s številko računa in licenčnim ključem); UpdateDays od 0 do 90, 0 pomeni samo na ukaz. Brez LicenseKey ostane shranjeni ključ; prehod ga nikoli ne vrne |
UpdateGeoIp() | takoj prenese obe datoteki geolokacijske zbirke in ju začne uporabljati brez ponovnega zagona; odgovor files s kind, buildDate in changed za vsako datoteko |
UploadGeoIp(FileName, [Source], [Force]) | preda prehodu datoteko geolokacijske zbirke (.mmdb, .mmdb.gz ali MaxMindov .tar.gz), za strežnik brez dostopa do interneta; Source določi navedbo vira, Force sprejme tudi starejšo datoteko |
ExportLoad([Days]) | dnevnik obremenitve zadnjih Days dni (privzeto 30) v obliki wkl-load-export/1, brez oseb, ključev, naslovov in vrednosti; shranite ga z JDoc.Save |
UpdateDatabases() | podatkovne zbirke, v katere modul za posodobitve prehoda namešča pakete: folder, databases (za vsako podatkovno zbirko id, product, gatewayAlias, povezava brez gesla, mape, varnostno kopiranje, settings) in problems (izpuščene konfiguracije); glejte HTTP: skrbništvo, razdelek „Posodobitve podatkovnih zbirk“ (dokumentacija podatkovnega prehoda). Nastavitve delovanja so v množici UpdateSettings |
UpdateStatus(DatabaseId), UpdateHistory(DatabaseId, [Skip], [Take]) | stanje podatkovne zbirke: odprti paketi s status, reason in deadlineUtc, seje (sessions), odstopanja (drift); zaključeni paketi z njihovimi koraki, najnovejši najprej (Take od 1 do 100, privzeto 20) |
ConfirmUpdate(DatabaseId, Package), DismissUpdate(DatabaseId, Package), RetryUpdate(DatabaseId, Package), CancelUpdateNotice(DatabaseId, Package), MoveUpdateDeadline(DatabaseId, Package, DeadlineUtc) | odločitve o paketu (Package = številka iz stanja ali zgodovine): potrditev, opustitev, ponovna namestitev, preklic napovedi, prestavitev roka (DeadlineUtc kot 2026-11-03T06:00:00Z). Odgovor: message in package (outcome done, announced, waiting ali failed). Paket v drugem stanju: gwErrConflict; modul ravno namešča paket: gwErrService |
UploadUpdate(DatabaseId, FileName) | postavi datoteko paketa (<izdelek>-schema-<različica>.zip, največ 64 MiB) v vhodno mapo podatkovne zbirke; prehod jo takoj sprejme. Odgovor kot pri odločitvi; isti paket že čaka: gwErrConflict |
CheckStore(), BackupStore(), ResealStore() | preveri shrambo, jo varnostno kopira (v mapo sicherungen poleg shrambe; odgovor file, schemaVersion, bytes) oziroma jo znova zapečati |
ReadSet(SetName, [Filter], [OrderBy], [Top]) | prebere množico entitet; vrstice so pod $.value |
CallProcedure(DataSource, Name, Name1, Value1, Name2, Value2, …) | pokliče shranjeno proceduro; argumenti so v parih, imena brez @, izpuščeni argument dobi privzeto vrednost procedure. Vrednosti: besedilo, števila (Currency in Decimal natančno), Boolean, Date (poslan kot besedilo ISO 8601, ki ga SQL Server pretvori v tip parametra) in Null. Odgovor: prvi nabor rezultatov pod $.data ($.data[0].<column>) ali affectedRowCount. Če procedura sama sproži sporočilo (THROW ali RAISERROR z besedilom), razred sproži gwErrRejected s tem besedilom. Pogodba: HTTP: specifikacija vmesnika, razdelek „Klicanje procedur“ (dokumentacija podatkovnega prehoda); potrebno je pravilo s procedures in POST |
Execute(Method, Path, [Body]) | katera koli druga zahteva; odgovor se vrne kot JDoc |
Napake
Vsaka napaka se sproži s stalno številko (WklGatewayError) in opisom v nemščini, ki se konča s
sporočilom prehoda, če ga ta vrne.
| Konstanta | Številka | Pomen |
|---|---|---|
gwErrUnreachable | vbObjectError + 2001 | ni povezave, tudi po ponovnih poskusih |
gwErrTimeout | + 2002 | ni odgovora v času TimeoutSeconds |
gwErrUnauthenticated | + 2003 | 401: ključ, račun ali geslo je zavrnjen ali pa ključa ni |
gwErrSecondFactor | + 2004 | zahteva se 2FA, koda pa ni bila podana ali je bila zavrnjena |
gwErrForbidden | + 2005 | 403 |
gwErrNotFound | + 2006 | 404 |
gwErrBadRequest | + 2007 | 400 |
gwErrConflict | + 2008 | 409, 412: vnos je bil medtem spremenjen |
gwErrRejected | + 2009 | 422: prehod je zahtevo zavrnil; pri sporočilu, ki ga sproži sama podatkovna zbirka, se opis konča s tem sporočilom |
gwErrTooMany | + 2010 | 429 |
gwErrService | + 2011 | 5xx |
gwErrAnswer | + 2012 | odgovor ni veljaven JSON |
gwErrConfiguration | + 2013 | nastavitve razreda si nasprotujejo |
Omejitve
- Gonilnik in razred imata ločeni seji 2FA, dokler aplikacija seje ne preda s
SESSION=. - Vsak odgovor se v okviru časovne omejitve prebere v celoti. Za velike količine podatkov uporabite povezane tabele (prek gonilnika ODBC), ne tega razreda.