„Google“ naudotojų kūrimas iš „PowerShell“ per API
Sveiki!
Šiame straipsnyje aprašomas „PowerShell“ sąveikos su „Google“ API diegimas, siekiant manipuliuoti „G Suite“ naudotojais.
Visoje organizacijoje naudojame kelias vidines ir debesies paslaugas. Dažniausiai jose suteikiamas įgaliojimas „Google“ arba „Active Directory“, tarp kurių negalime išlaikyti kopijos; atitinkamai, naujam darbuotojui išėjus, reikia susikurti/įgalinti paskyrą šiose dviejose sistemose. Norėdami automatizuoti procesą, nusprendėme parašyti scenarijų, kuris surenka informaciją ir siunčia ją abiem tarnyboms.
Leidimas
Rengdami reikalavimus, autorizavimui nusprendėme naudoti tikrus administratorius, kurie supaprastina veiksmų analizę atsitiktinių ar tyčinių masinių pakeitimų atveju.
Pasirinkau scenarijų, kuris naudojamas autorizuoti darbalaukio programose. Taip pat yra galimybė naudoti paslaugos paskyrą, kuri nereikalauja nereikalingų vartotojo judesių.
Žemiau esančiame paveikslėlyje yra schematiškas pasirinkto scenarijaus aprašymas iš Google puslapio.
Pirmiausia vartotoją siunčiame į „Google“ paskyros autentifikavimo puslapį, nurodydami GET parametrus:
programos id
sritis, prie kurių programai reikia prieigos
adresas, kuriuo vartotojas bus nukreiptas baigęs procedūrą
kaip mes atnaujinsime žetoną
Apsaugos kodas
patvirtinimo kodo perdavimo formatas
Kai autorizacija bus baigta, vartotojas bus nukreiptas į pirmojoje užklausoje nurodytą puslapį su klaida arba autorizavimo kodu, kurį perdavė GET parametrai
Programa (scenarijus) turės gauti šiuos parametrus ir, gavusi kodą, pateikti šią užklausą, kad gautų žetonus
Jei užklausa teisinga, Google API pateikia:
Prieigos prieigos raktas, su kuriuo galime pateikti užklausas
Šio žetono galiojimo laikas
Atnaujinimo prieigos raktas reikalingas norint atnaujinti prieigos prieigos raktą.
Pirmiausia turite eiti į „Google“ API konsolę: Kredencialai – Google API konsolė, pasirinkite norimą programą ir kredencialų skiltyje sukurkite kliento OAuth identifikatorių. Ten (arba vėliau, sukurto identifikatoriaus savybėse) turite nurodyti adresus, į kuriuos leidžiama nukreipti. Mūsų atveju tai bus keli „localhost“ įrašai su skirtingais prievadais (žr. toliau).
Kad būtų patogiau skaityti scenarijaus algoritmą, pirmuosius veiksmus galite rodyti atskiroje funkcijoje, kuri grąžins programos prieigos ir atnaujinimo prieigos raktus:
Mes nustatome kliento ID ir kliento paslaptį, gautą „OAuth“ kliento identifikatoriaus ypatybėse, o kodo tikrintuvas yra 43–128 simbolių eilutė, kuri turi būti atsitiktinai sugeneruota iš nerezervuotų simbolių: [AZ] / [az] / [0-9] / "-" / "." / "_" / "~".
Tada šis kodas bus perduotas dar kartą. Tai pašalina pažeidžiamumą, dėl kurio užpuolikas gali perimti atsakymą, grąžintą kaip peradresavimą gavus vartotojo įgaliojimą.
Kodo tikrintuvą dabartinėje užklausoje galite atsiųsti aiškiu tekstu (dėl to jis netenka prasmės – tinka tik sistemoms, kurios nepalaiko SHA256), arba sukurdami maišą naudodami SHA256 algoritmą, kuris turi būti užkoduotas BASE64Url (skirtinga iš Base64 dviem lentelės simboliais) ir pašalinant simbolių eilučių pabaigas: =.
Tada turime pradėti klausytis http vietiniame kompiuteryje, kad gautume atsakymą po autorizacijos, kuris bus grąžintas kaip peradresavimas.
Administravimo užduotys atliekamos specialiame serveryje, negalime atmesti galimybės, kad scenarijų vykdys keli administratoriai vienu metu, todėl jis atsitiktinai parinks prievadą dabartiniam vartotojui, tačiau nurodžiau iš anksto nustatytus prievadus, nes jie taip pat turi būti įtraukti kaip patikimi API konsolėje.
access_type=offline reiškia, kad programa gali pati atnaujinti pasibaigusį prieigos raktą be vartotojo sąveikos su naršykle, atsako_tipas=kodas nustato formatą, kaip bus grąžintas kodas (nuoroda į seną autorizacijos metodą, kai vartotojas nukopijavo kodą iš naršyklės į scenarijų), sritis nurodo prieigos apimtį ir tipą. Jie turi būti atskirti tarpais arba %20 (pagal URL kodavimą). Prieigos sričių sąrašą su tipais galite pamatyti čia: „OAuth 2.0“ taikymo sritis, skirta „Google“ API.
Gavusi autorizacijos kodą, programa grąžins naršyklei uždarymo pranešimą, nustos klausytis prievado ir išsiųs POST užklausą, kad gautų prieigos raktą. Jame nurodome anksčiau nurodytą ID ir paslaptį iš konsolės API, adresą, į kurį bus nukreiptas vartotojas, ir grant_type pagal protokolo specifikaciją.
Atsakydami gausime prieigos prieigos raktą, jo galiojimo laiką sekundėmis ir atnaujinimo prieigos raktą, su kuriuo galėsime atnaujinti prieigos raktą.
Programa turi saugoti žetonus saugioje vietoje su ilgu galiojimo laiku, todėl kol neatšauksime gautos prieigos, programa negrąžins atnaujinimo prieigos rakto. Pabaigoje pridėjau prašymą atšaukti prieigos raktą; jei paraiška nebuvo sėkmingai užpildyta ir atnaujinimo prieigos raktas nebuvo grąžintas, ji pradės procedūrą iš naujo (manėme, kad nesaugu saugoti žetonus vietoje terminale, ir mes to nedarome nenoriu apsunkinti dalykų su kriptografija arba dažnai atidaryti naršyklę).
Kaip jau pastebėjote, atšaukiant prieigos raktą naudojamas Invoke-WebRequest. Skirtingai nei Invoke-RestMethod, jis negrąžina gautų duomenų tinkamu formatu ir parodo užklausos būseną.
Tada scenarijus prašo įvesti vartotojo vardą ir pavardę, sugeneruojant prisijungimo vardą + el.
Paklausimai
Sekančios užklausos bus – pirmiausia turite patikrinti, ar vartotojas su tuo pačiu prisijungimu jau egzistuoja, kad priimtumėte sprendimą sukurti naują arba įjungti esamą.
Nusprendžiau įgyvendinti visas užklausas vienos funkcijos formatu pasirinkdamas, naudodamas jungiklį:
Kiekvienoje užklausoje turite nusiųsti autorizacijos antraštę, kurioje yra prieigos rakto tipas ir pats prieigos raktas. Šiuo metu žetono tipas visada yra Nešėjas. Nes turime patikrinti ar nepasibaigęs tokeno galiojimas ir atnaujinti po valandos nuo jo išdavimo momento, nurodžiau užklausą kitai funkcijai, kuri grąžina Access tokeną. Ta pati kodo dalis yra scenarijaus pradžioje, kai gaunamas pirmasis prieigos raktas:
El. pašto užklausa:$query paprašys API ieškoti vartotojo, turinčio būtent tą el. pašto adresą, įskaitant slapyvardžius. Taip pat galite naudoti pakaitos simbolį: =, :, :{PREFIX}*.
Norėdami gauti duomenis, naudokite GET užklausos metodą, įterpkite duomenis (sukurdami paskyrą arba įtraukdami narį į grupę) - POST, atnaujinti esamus duomenis - PUT, ištrinti įrašą (pavyzdžiui, narį iš grupės) - IŠTRINTI.
Scenarijus taip pat paprašys telefono numerio (nepatvirtintos eilutės) ir įtraukimo į regioninę platinimo grupę. Jis nusprendžia, kurį organizacinį vienetą vartotojas turi turėti pagal pasirinktą „Active Directory“ OU ir pateikia slaptažodį:
do {
$phone = Read-Host "Телефон в формате +7хххххххх"
} while (-not $phone)
do {
$moscow = Read-Host "В Московский офис? (y/n) "
} while (-not (($moscow -eq 'y') -or ($moscow -eq 'n')))
$orgunit = '/'
if ($OU -like "*OU=Delivery,OU=Users,OU=ROOT,DC=rocket,DC=local") {
Write-host "Будет создана в /Team delivery"
$orgunit = "/Team delivery"
}
$Password = -join ( 48..57 + 65..90 + 97..122 | Get-Random -Count 12 | % {[char]$_})+"*Ba"
Ir tada jis pradeda manipuliuoti paskyra:
$query = @{
email = $email
givenName = $firstname
familyName = $lastname
password = $password
phone = $phone
orgunit = $orgunit
}
if ($GMailExist) {
Write-Host "Запускаем изменение аккаунта" -f mag
(GoogleQuery 'UpdateAccount' $query) | fl
write-host "Не забудь проверить группы у включенного $Username в Google."
} else {
Write-Host "Запускаем создание аккаунта" -f mag
(GoogleQuery 'CreateAccount' $query) | fl
}
if ($moscow -eq "y"){
write-host "Добавляем в группу moscowoffice"
$query = @{
groupkey = '[email protected]'
email = $email
}
(GoogleQuery 'AddMember' $query) | fl
}
Paskyros atnaujinimo ir kūrimo funkcijos turi panašią sintaksę, nebūtini visi papildomi laukai, skiltyje su telefonų numeriais reikia nurodyti masyvą, kuriame gali būti iki vieno įrašo su numeriu ir jo tipu.
Kad negautume klaidos pridedant vartotoją į grupę, pirmiausia galime patikrinti, ar jis jau yra šios grupės narys, gaudami grupės narių sąrašą arba sudėtį iš paties vartotojo.
Užklausa dėl konkretaus vartotojo narystės grupėje nebus rekursinė ir bus rodoma tik tiesioginė narystė. Įtraukti vartotoją į pirminę grupę, kuri jau turi antrinę grupę, kurios narys jis yra, bus sėkmingas.
išvada
Belieka nusiųsti vartotojui naujos paskyros slaptažodį. Tai darome SMS žinute, o bendrąją informaciją su instrukcijomis ir prisijungimu siunčiame asmeniniu el. paštu, kurį kartu su telefono numeriu pateikė įdarbinimo skyrius. Kaip alternatyvą galite sutaupyti pinigų ir nusiųsti slaptažodį į slaptą telegramos pokalbį, kuris taip pat gali būti laikomas antruoju veiksniu („MacBooks“ bus išimtis).
Ačiū, kad perskaitėte iki galo. Džiaugsiuosi sulaukęs pasiūlymų, kaip pagerinti straipsnių rašymo stilių, ir linkiu, kad rašant scenarijus būtų mažiau klaidų =)
Sąrašas nuorodų, kurios gali būti naudingos tematiškai arba tiesiog atsakyti į klausimus: