Godkendelse af webserviceforespørgsler med PowerShell

Jeg har for nylig lavet en præsentation om at bruge PowerShell til at få adgang til webtjenester, der dækker nogle af de ting, jeg har diskuteret i denne kolonne i de sidste par måneder, da nogen spurgte mig: "Hvilken form for kryptering og godkendelse bruger webtjenester?" Jeg må indrømme, at jeg ikke havde et svar et øjeblik. Spørgsmålet havde vækket "Windows Security Mechanics" -delen af ​​min hjerne, som kom op i alle emner. Men så vågnede nogle andre neuroner, og jeg huskede svaret. Så svarede jeg med noget som "Det samme som du bruger hele tiden på web-SSL, bruger-id'er og adgangskoder."

Opsætning af en SSL-kanal i PowerShell med påberåbe-webrequest or påberåbe-restmethod er lige så simpelt som at prefixe URI med https i stedet for http, og selvfølgelig er det offentlige / private nøglepar i SSL-certifikatet langt mere sikkert end nogen adgangskode. Når du bruger et niveau af sikkerhed, der kan bruge nøgler op til 4,096-bits i længden, bliver så allestedsnærværende og simpelt som åndedrætsluft, kan du udveksle bruger-id'er og adgangskoder lige på den krypterede kanal (og ja, jeg ved det, kvantum computing vil bringe udgangen af ​​certifikater og vestlige civilisation, men jeg gætter det ikke vil ske endnu et stykke tid.)

Således er alt hvad du behøver at gøre for at tilfredsstille de fleste webtjenester, enten at gøre noget overhovedet (som det er tilfældet for mange offentlige tjenester) eller bare få en nøgle eller et brugerID / nøglepar. (Bemærk at nøgle eller som det i stigende grad henvises til hemmelighed er stort set bare erstatning for et kodeord.) Vi har allerede set et eksempel på det da jeg demonstrerede, hvordan man beder Bing om at kigge op i byen / amt / stat for en postnummer. Tjenesten er let at søge, men først kræver det, at du spørger Microsoft om en nøgle, så virksomheden kan spore, hvor mange opslag du gør.

I Bing-sagen behøvede jeg kun at indsætte nøglen i webadressen til anmodningen (som givet, er ikke beskyttet af SSL, men det er sådan, Microsoft ønsker det), men i nogle tilfælde skal jeg blive lidt mere fornuftig og bygge det i en HTTP header, som is beskyttet af en SSL-forbindelse. Sådan gør du det.

I tidligere eksempler har du set, at National Oceanic and Atmospheric Administration (NOAA) tilbyder et væld af interessante geofysiske datasæt. De fleste af dem kræver ikke bruger-id'er og nøgler, men NOAA's National Climate Data Center (NCDC) gør. Dens service er RESTful og giver et overblik over, hvordan man får adgang til tjenesten og hvor man kan anmode om en nøgle, som den kalder a token.

NCDC har mange datasæt, men en af ​​de mest interessante har ID GHCND, som er kort for Global Historical Climatology Network - Dagligt resumé. Du kan anmode om daglige oversigter for enhver række datoer inden for en given postnummer med en webadresse som denne:

                              https://www.ncdc.noaa.gov/cdo-web/api/v2/data?datasetid=<DSetID>&locationid=ZIP:<zipcode>&startdate=<dstart>&enddate=&<dend>

For eksempel kan du bruge denne webadresse til at se opsummeringen til februar 10, 2016, i postnummer 23456:

                              https://www.ncdc.noaa.gov/cdo-web/api/v2/data?datasetid=GHCND&locationid=ZIP:23456&startdate=2016-02-10&enddate=2016-02-10

På nuværende tidspunkt kan du sikkert sammensætte et par PowerShell-cmdlets for at få NCDC til at returnere dette resumé, men en påberåbe-webrequest or påberåbe-restmethod ville mislykkes med en 400-fejl: Token parameter er påkrævet. Antag da, at du ansøgte om og fik et token fra den tidligere nævnte NCDC-URL, og dens værdi var XYZ. (Det ville ikke være, da nøglerne er ret lange.) For at få NCDC til at opfylde din anmodning, skal din anmodning indeholde denne tekst i HTTP-overskriften:

                              token = XYZ

Invoke-webrequest og påberåbe-restmethod begge har a -headers parameter, der accepterer et hashbord med navn / værdi par, så du kan oprette en sådan som:

                              [e-mail beskyttet] {token = "XYZ"}

Du kan så bare passere det som -overskrifter $ HeaderPairs. Sæt det hele sammen, og du vil komme op med noget som dette:

[Email protected]{Token = 'XYZ'}
$URI = ‘https://www.ncdc.noaa.gov/cdo-web/api/v2/data?datasetid=GHCND&locationid=ZIP:23456&startdate=2016-02-10&enddate=2016-02-10’
$ result = irm ​​$ URI-headers $ HeaderPairs

Fordi du har brugt påberåbe-restmethod snarere end påberåbe-webrequest, har resultaterne allerede været de-JSONed i et PowerShell objekt med attributten Resultater, skriv så følgende for at se resultaterne:

                              $ result.results

Du kan se otte datablokke, der ligner denne:

date : 2016-02-10T00:00:00
datatype: TMAX
station: GHCND: USC00440385
attributter: ,, H,
værdi: 94

De interessante dele er datatype, som identificerer datagruppen (TMAX er den højeste temperatur målt i dag, og TMIN er den laveste målte) og værdi, som er -6 for TMIN og 94 for TMAX. Ja, det er en stor rækkevidde, men begge tal er Celsius-temperaturen i tiendedele grader, så den laveste var -0.6 C og den højeste var 9.4 C, omkring 31 grader og 49 grader Fahrenheit.

Så for at pakke op, vil mange webtjenester ikke behøve godkendelse, men de, der gør det, vil normalt have brug for noget så enkelt som en nøgle eller måske et bruger-id / nøglepar. Mange tjenester sætter nøglen ind i webadressen, men dem, der har deres "overskrifter" lige, så er det mange, der har brug for det i overskriften, og nu ved du, hvordan du sender det i PowerShell. (Og glem ikke at bruge https i URL!) Se dig i næste måned.

Efterlad en kommentar

Dette websted bruger Akismet til at reducere spam. Lær, hvordan dine kommentardata behandles.