ΠΠ΄ΡΠ°Π²ΠΎ!
ΠΠ²Π°Π° ΡΡΠ°ΡΠΈΡΠ° ΡΠ΅ ΡΠ° ΠΎΠΏΠΈΡΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΡΠ°ΡΠ° Π½Π° PowerShell ΡΠΎ Google API Π·Π° ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠ°ΡΠ΅ ΡΠΎ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΈΡΠ΅ Π½Π° G Suite.
ΠΠΈΠ΅ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π²Π½Π°ΡΡΠ΅ΡΠ½ΠΈ ΠΈ ΠΎΠ±Π»Π°ΠΊ ΡΡΠ»ΡΠ³ΠΈ Π½ΠΈΠ· ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡΠ°ΡΠ°. ΠΠΎ Π½Π°ΡΠ³ΠΎΠ»Π΅ΠΌ Π΄Π΅Π», ΠΎΠ²Π»Π°ΡΡΡΠ²Π°ΡΠ΅ΡΠΎ Π²ΠΎ Π½ΠΈΠ² ΡΠ΅ ΡΠ²Π΅Π΄ΡΠ²Π° Π½Π° Google ΠΈΠ»ΠΈ Active Directory, ΠΌΠ΅ΡΡ ΠΊΠΎΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΎΠ΄ΡΠΆΡΠ²Π°ΠΌΠ΅ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°; ΡΠΎΠΎΠ΄Π²Π΅ΡΠ½ΠΎ, ΠΊΠΎΠ³Π° ΡΠ΅ Π·Π°ΠΌΠΈΠ½Π΅ Π½ΠΎΠ² Π²ΡΠ°Π±ΠΎΡΠ΅Π½, ΡΡΠ΅Π±Π° Π΄Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅/ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈΡΠ΅ ΡΠΌΠ΅ΡΠΊΠ° Π²ΠΎ ΠΎΠ²ΠΈΠ΅ Π΄Π²Π° ΡΠΈΡΡΠ΅ΠΌΠΈ. ΠΠ° Π΄Π° Π³ΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΎΡΠ΅ΡΠΎΡ, ΡΠ΅ΡΠΈΠ²ΠΌΠ΅ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΠΌΠ΅ ΡΠΊΡΠΈΠΏΡΠ° ΡΡΠΎ ΡΠΎΠ±ΠΈΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΈ Π³ΠΈ ΠΈΡΠΏΡΠ°ΡΠ° Π΄ΠΎ Π΄Π²Π΅ΡΠ΅ ΡΡΠ»ΡΠ³ΠΈ.
ΠΠ²Π»Π°ΡΡΡΠ²Π°ΡΠ΅
ΠΡΠΈ ΠΈΠ·Π³ΠΎΡΠ²ΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° Π±Π°ΡΠ°ΡΠ°ΡΠ°, ΡΠ΅ΡΠΈΠ²ΠΌΠ΅ Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ Π²ΠΈΡΡΠΈΠ½ΡΠΊΠΈ ΡΠΎΠ²Π΅ΡΠΊΠΈ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠΈ Π·Π° ΠΎΠ²Π»Π°ΡΡΡΠ²Π°ΡΠ΅; ΠΎΠ²Π° ΡΠ° ΠΏΠΎΠ΅Π΄Π½ΠΎΡΡΠ°Π²ΡΠ²Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠ° Π½Π° Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈΡΠ΅ Π²ΠΎ ΡΠ»ΡΡΠ°Ρ Π½Π° ΡΠ»ΡΡΠ°ΡΠ½ΠΈ ΠΈΠ»ΠΈ Π½Π°ΠΌΠ΅ΡΠ½ΠΈ ΠΌΠ°ΡΠΈΠ²Π½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ.
Google API Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠ°Ρ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΡ OAuth 2.0 Π·Π° Π°Π²ΡΠ΅Π½ΡΠΈΠΊΠ°ΡΠΈΡΠ° ΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡΠ°. Π‘Π»ΡΡΠ°ΠΈ Π·Π° ΡΠΏΠΎΡΡΠ΅Π±Π° ΠΈ ΠΏΠΎΠ΄Π΅ΡΠ°Π»Π½ΠΈ ΠΎΠΏΠΈΡΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΡΠ΄Π°Ρ ΠΎΠ²Π΄Π΅:
ΠΠΎ ΠΈΠ·Π±ΡΠ°Π² ΡΠΊΡΠΈΠΏΡΠ°ΡΠ° ΡΡΠΎ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Π·Π° Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡΠ° Π²ΠΎ Π΄Π΅ΡΠΊΡΠΎΠΏ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈΡΠ΅. ΠΠΎΡΡΠΎΠΈ ΠΈ ΠΎΠΏΡΠΈΡΠ° Π·Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΡΠ΅ΡΠ²ΠΈΡΠ½Π° ΡΠΌΠ΅ΡΠΊΠ°, ΠΊΠΎΡΠ° Π½Π΅ Π±Π°ΡΠ° Π½Π΅ΠΏΠΎΡΡΠ΅Π±Π½ΠΈ Π΄Π²ΠΈΠΆΠ΅ΡΠ° ΠΎΠ΄ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ.
Π‘Π»ΠΈΠΊΠ°ΡΠ° ΠΏΠΎΠ΄ΠΎΠ»Ρ Π΅ ΡΠ΅ΠΌΠ°ΡΡΠΊΠΈ ΠΎΠΏΠΈΡ Π½Π° ΠΈΠ·Π±ΡΠ°Π½ΠΎΡΠΎ ΡΡΠ΅Π½Π°ΡΠΈΠΎ ΠΎΠ΄ ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° Π½Π° Google.
- ΠΡΠ²ΠΎ, Π³ΠΎ ΠΈΡΠΏΡΠ°ΡΠ°ΠΌΠ΅ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° Π·Π° Π°Π²ΡΠ΅Π½ΡΠΈΠΊΠ°ΡΠΈΡΠ° Π½Π° ΡΠΌΠ΅ΡΠΊΠ°ΡΠ° Π½Π° Google, Π½Π°Π²Π΅Π΄ΡΠ²Π°ΡΡΠΈ Π³ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ GET:
- ΠΈΠ΄ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ°
- ΠΎΠ±Π»Π°ΡΡΠΈ Π΄ΠΎ ΠΊΠΎΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° ΠΈΠΌΠ° ΠΏΠΎΡΡΠ΅Π±Π° ΠΎΠ΄ ΠΏΡΠΈΡΡΠ°ΠΏ
- Π°Π΄ΡΠ΅ΡΠ°ΡΠ° Π½Π° ΠΊΠΎΡΠ° ΡΠ΅ Π±ΠΈΠ΄Π΅ ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ΅Π½ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ ΠΏΠΎ Π·Π°Π²ΡΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΠΎΡΡΠ°ΠΏΠΊΠ°ΡΠ°
- Π½Π°ΡΠΈΠ½ΠΎΡ Π½Π° ΠΊΠΎΡ ΡΠ΅ Π³ΠΎ Π°ΠΆΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠΎΠΊΠ΅Π½ΠΎΡ
- ΠΠ΅Π·Π±Π΅Π΄Π½ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄
- ΡΠΎΡΠΌΠ°Ρ Π½Π° ΠΏΡΠ΅Π½ΠΎΡ Π½Π° ΠΊΠΎΠ΄ΠΎΡ Π·Π° Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΠ°
- ΠΠΎ Π·Π°Π²ΡΡΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΠΎΠ²Π»Π°ΡΡΡΠ²Π°ΡΠ΅ΡΠΎ, ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ ΡΠ΅ Π±ΠΈΠ΄Π΅ ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ΅Π½ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° Π½Π°Π²Π΅Π΄Π΅Π½Π° Π²ΠΎ ΠΏΡΠ²ΠΎΡΠΎ Π±Π°ΡΠ°ΡΠ΅, ΡΠΎ Π³ΡΠ΅ΡΠΊΠ° ΠΈΠ»ΠΈ ΠΊΠΎΠ΄ Π·Π° ΠΎΠ²Π»Π°ΡΡΡΠ²Π°ΡΠ΅ ΠΏΡΠ΅Π½Π΅ΡΠ΅Π½ ΠΎΠ΄ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ GET
- ΠΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° (ΡΠΊΡΠΈΠΏΡΠ°ΡΠ°) ΡΠ΅ ΡΡΠ΅Π±Π° Π΄Π° Π³ΠΈ ΠΏΡΠΈΠΌΠΈ ΠΎΠ²ΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΈ, Π°ΠΊΠΎ ΡΠ° Π΄ΠΎΠ±ΠΈΠ΅ ΡΠΈΡΡΠ°ΡΠ°, Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈ ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ Π±Π°ΡΠ°ΡΠ΅ Π·Π° Π΄Π° Π΄ΠΎΠ±ΠΈΠ΅ ΡΠΎΠΊΠ΅Π½ΠΈ
- ΠΠΊΠΎ Π±Π°ΡΠ°ΡΠ΅ΡΠΎ Π΅ ΡΠΎΡΠ½ΠΎ, Google API Π²ΡΠ°ΡΠ°:
- ΠΡΠΈΡΡΠ°ΠΏΠ΅Π½ ΡΠΎΠΊΠ΅Π½ ΡΠΎ ΠΊΠΎΡ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΏΠΎΠ΄Π½Π΅ΡΡΠ²Π°ΠΌΠ΅ Π±Π°ΡΠ°ΡΠ°
- ΠΠ΅ΡΠΈΠΎΠ΄ΠΎΡ Π½Π° Π²Π°ΠΆΠ½ΠΎΡΡ Π½Π° ΠΎΠ²ΠΎΡ ΡΠΎΠΊΠ΅Π½
- ΠΠΎΡΡΠ΅Π±Π΅Π½ Π΅ ΡΠΎΠΊΠ΅Π½ Π·Π° ΠΎΡΠ²Π΅ΠΆΡΠ²Π°ΡΠ΅ Π·Π° Π΄Π° ΡΠ΅ ΠΎΡΠ²Π΅ΠΆΠΈ ΡΠΎΠΊΠ΅Π½ΠΎΡ Π·Π° ΠΏΡΠΈΡΡΠ°ΠΏ.
ΠΡΠ²ΠΎ ΡΡΠ΅Π±Π° Π΄Π° ΠΎΡΠΈΠ΄Π΅ΡΠ΅ Π½Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ° Π½Π° Google API:
ΠΠ° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΏΠΎΡΠ΄ΠΎΠ±Π½ΠΎ Π΄Π° Π³ΠΎ ΡΠΈΡΠ°ΡΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΡ Π·Π° ΡΠΊΡΠΈΠΏΡΠ°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΈ ΠΏΡΠΈΠΊΠ°ΠΆΠ΅ΡΠ΅ ΠΏΡΠ²ΠΈΡΠ΅ ΡΠ΅ΠΊΠΎΡΠΈ Π²ΠΎ ΠΏΠΎΡΠ΅Π±Π½Π° ΡΡΠ½ΠΊΡΠΈΡΠ° ΡΡΠΎ ΡΠ΅ Π³ΠΎ Π²ΡΠ°ΡΠΈ ΠΏΡΠΈΡΡΠ°ΠΏΠΎΡ ΠΈ ΡΠ΅ Π³ΠΈ ΠΎΡΠ²Π΅ΠΆΠΈ ΡΠΎΠΊΠ΅Π½ΠΈΡΠ΅ Π·Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ°:
$client_secret = 'Our Client Secret'
$client_id = 'Our Client ID'
function Get-GoogleAuthToken {
if (-not [System.Net.HttpListener]::IsSupported) {
"HttpListener is not supported."
exit 1
}
$codeverifier = -join ((65..90) + (97..122) + (48..57) + 45 + 46 + 95 + 126 |Get-Random -Count 60| % {[char]$_})
$hasher = new-object System.Security.Cryptography.SHA256Managed
$hashByteArray = $hasher.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($codeverifier))
$base64 = ((([System.Convert]::ToBase64String($hashByteArray)).replace('=','')).replace('+','-')).replace('/','_')
$ports = @(10600,15084,39700,42847,65387,32079)
$port = $ports[(get-random -Minimum 0 -maximum 5)]
Write-Host "Start browser..."
Start-Process "https://accounts.google.com/o/oauth2/v2/auth?code_challenge_method=S256&code_challenge=$base64&access_type=offline&client_id=$client_id&redirect_uri=http://localhost:$port&response_type=code&scope=https://www.googleapis.com/auth/admin.directory.user https://www.googleapis.com/auth/admin.directory.group"
$listener = New-Object System.Net.HttpListener
$listener.Prefixes.Add("http://localhost:"+$port+'/')
try {$listener.Start()} catch {
"Unable to start listener."
exit 1
}
while (($code -eq $null)) {
$context = $listener.GetContext()
Write-Host "Connection accepted" -f 'mag'
$url = $context.Request.RawUrl
$code = $url.split('?')[1].split('=')[1].split('&')[0]
if ($url.split('?')[1].split('=')[0] -eq 'error') {
Write-Host "Error!"$code -f 'red'
$buffer = [System.Text.Encoding]::UTF8.GetBytes("Error!"+$code)
$context.Response.ContentLength64 = $buffer.Length
$context.Response.OutputStream.Write($buffer, 0, $buffer.Length)
$context.Response.OutputStream.Close()
$listener.Stop()
exit 1
}
$buffer = [System.Text.Encoding]::UTF8.GetBytes("Now you can close this browser tab.")
$context.Response.ContentLength64 = $buffer.Length
$context.Response.OutputStream.Write($buffer, 0, $buffer.Length)
$context.Response.OutputStream.Close()
$listener.Stop()
}
Return Invoke-RestMethod -Method Post -Uri "https://www.googleapis.com/oauth2/v4/token" -Body @{
code = $code
client_id = $client_id
client_secret = $client_secret
redirect_uri = 'http://localhost:'+$port
grant_type = 'authorization_code'
code_verifier = $codeverifier
}
$code = $null
ΠΠΈ ΠΏΠΎΡΡΠ°Π²ΠΈΠ²ΠΌΠ΅ ΠΠ Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΡ ΠΈ Π’Π°ΡΠ½Π°ΡΠ° Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΡ Π΄ΠΎΠ±ΠΈΠ΅Π½ΠΈ Π²ΠΎ ΡΠ²ΠΎΡΡΡΠ²Π°ΡΠ° Π½Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΡ Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΡ OAuth, Π° ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°ΡΠΎΡ Π½Π° ΠΊΠΎΠ΄ΠΎΡ Π΅ Π½ΠΈΠ·Π° ΠΎΠ΄ 43 Π΄ΠΎ 128 Π·Π½Π°ΡΠΈ ΡΡΠΎ ΠΌΠΎΡΠ° ΡΠ»ΡΡΠ°ΡΠ½ΠΎ Π΄Π° ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π°Ρ ΠΎΠ΄ Π½Π΅ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΠ°Π½ΠΈ Π·Π½Π°ΡΠΈ: [AZ] / [az] / [0-9 ] / "-" / "." / "_" / "~".
ΠΠ²ΠΎΡ ΠΊΠΎΠ΄ ΠΏΠΎΡΠΎΠ° ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΡΠ΅ ΡΠ΅ ΠΏΡΠ΅Π½Π΅ΡΠ΅. ΠΠ° Π΅Π»ΠΈΠΌΠΈΠ½ΠΈΡΠ° ΡΠ°Π½Π»ΠΈΠ²ΠΎΡΡΠ° Π²ΠΎ ΠΊΠΎΡΠ° Π½Π°ΠΏΠ°ΡΠ°ΡΠΎΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡΠ΅ΡΡΠ΅ΡΠ½Π΅ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ Π²ΡΠ°ΡΠ΅Π½ ΠΊΠ°ΠΊΠΎ ΠΏΡΠ΅Π½Π°ΡΠΎΡΡΠ²Π°ΡΠ΅ ΠΏΠΎ ΠΎΠ²Π»Π°ΡΡΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ.
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΡΠΏΡΠ°ΡΠΈΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°Ρ Π½Π° ΠΊΠΎΠ΄ Π²ΠΎ ΡΠ΅ΠΊΠΎΠ²Π½ΠΎΡΠΎ Π±Π°ΡΠ°ΡΠ΅ Π²ΠΎ ΡΠ°ΡΠ΅Π½ ΡΠ΅ΠΊΡΡ (ΡΡΠΎ Π³ΠΎ ΠΏΡΠ°Π²ΠΈ Π±Π΅ΡΠΌΠΈΡΠ»Π΅Π½ΠΎ - ΠΎΠ²Π° Π΅ ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎ ΡΠ°ΠΌΠΎ Π·Π° ΡΠΈΡΡΠ΅ΠΌΠΈ ΠΊΠΎΠΈ Π½Π΅ ΠΏΠΎΠ΄Π΄ΡΠΆΡΠ²Π°Π°Ρ SHA256) ΠΈΠ»ΠΈ ΡΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΠ΅ Ρ
Π°Ρ ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° Π°Π»Π³ΠΎΡΠΈΡΠ°ΠΌ SHA256, ΠΊΠΎΡ ΠΌΠΎΡΠ° Π΄Π° Π±ΠΈΠ΄Π΅ ΠΊΠΎΠ΄ΠΈΡΠ°Π½ Π²ΠΎ BASE64Url (ΡΠ°Π·Π»ΠΈΡΠ½ΠΎ ΠΎΠ΄ Base64 ΡΠΎ Π΄Π²Π° Π·Π½Π°ΠΊΠ° ΠΎΠ΄ ΡΠ°Π±Π΅Π»Π°ΡΠ°) ΠΈ ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°ΡΠ΅ Π½Π° Π·Π°Π²ΡΡΠ΅ΡΠΎΡΠΈΡΠ΅ Π½Π° Π»ΠΈΠ½ΠΈΡΠΊΠΈΡΠ΅ Π»ΠΈΠ½ΠΈΠΈ: =.
Π‘Π»Π΅Π΄Π½ΠΎ, ΡΡΠ΅Π±Π° Π΄Π° ΠΏΠΎΡΠ½Π΅ΠΌΠ΅ Π΄Π° ΡΠ»ΡΡΠ°ΠΌΠ΅ http Π½Π° Π»ΠΎΠΊΠ°Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° Π·Π° Π΄Π° Π΄ΠΎΠ±ΠΈΠ΅ΠΌΠ΅ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ ΠΏΠΎ ΠΎΠ²Π»Π°ΡΡΡΠ²Π°ΡΠ΅ΡΠΎ, ΠΊΠΎΡ ΡΠ΅ Π±ΠΈΠ΄Π΅ Π²ΡΠ°ΡΠ΅Π½ ΠΊΠ°ΠΊΠΎ ΠΏΡΠ΅Π½Π°ΡΠΎΡΡΠ²Π°ΡΠ΅.
ΠΠ΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΈΠ²Π½ΠΈΡΠ΅ Π·Π°Π΄Π°ΡΠΈ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π°Π°Ρ Π½Π° ΠΏΠΎΡΠ΅Π±Π΅Π½ ΡΠ΅ΡΠ²Π΅Ρ, Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΡΠ° ΠΈΡΠΊΠ»ΡΡΠΈΠΌΠ΅ ΠΌΠΎΠΆΠ½ΠΎΡΡΠ° Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠΈ Π΄Π° ΡΠ° ΠΈΠ·Π²ΡΡΡΠ²Π°Π°Ρ ΡΠΊΡΠΈΠΏΡΠ°ΡΠ° Π²ΠΎ ΠΈΡΡΠΎ Π²ΡΠ΅ΠΌΠ΅, ΡΠ°ΠΊΠ° ΡΡΠΎ ΡΠ»ΡΡΠ°ΡΠ½ΠΎ ΡΠ΅ ΠΈΠ·Π±Π΅ΡΠ΅ ΠΏΠΎΡΡΠ° Π·Π° ΡΠ΅ΠΊΠΎΠ²Π½ΠΈΠΎΡ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ, Π½ΠΎ ΡΠ°Ρ Π½Π°Π²Π΅Π΄ΠΎΠ² ΠΏΡΠ΅Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ ΠΏΠΎΡΡΠΈ Π±ΠΈΠ΄Π΅ΡΡΠΈ ΡΠΈΠ΅ ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° ΠΌΠΎΡΠ° Π΄Π° ΡΠ΅ Π΄ΠΎΠ΄Π°Π΄Π°Ρ ΠΊΠ°ΠΊΠΎ Π΄ΠΎΠ²Π΅ΡΠ»ΠΈΠ²ΠΈ Π²ΠΎ ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ° API.
ΠΏΡΠΈΡΡΠ°ΠΏ_ΡΠΈΠΏ=ΠΎΡΠ»Π°ΡΠ½ Π·Π½Π°ΡΠΈ Π΄Π΅ΠΊΠ° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° ΠΌΠΎΠΆΠ΅ ΡΠ°ΠΌΠ° Π΄Π° Π°ΠΆΡΡΠΈΡΠ° ΠΈΡΡΠ΅ΡΠ΅Π½ ΡΠΎΠΊΠ΅Π½ Π±Π΅Π· ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠ° ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΡΠ° ΡΠΎ ΠΏΡΠ΅Π»ΠΈΡΡΡΠ²Π°ΡΠΎΡ,
ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ_ΡΠΈΠΏ=ΡΠΈΡΡΠ° Π³ΠΎ ΠΏΠΎΡΡΠ°Π²ΡΠ²Π° ΡΠΎΡΠΌΠ°ΡΠΎΡ ΠΊΠ°ΠΊΠΎ ΡΠ΅ ΡΠ΅ Π²ΡΠ°ΡΠΈ ΠΊΠΎΠ΄ΠΎΡ (ΡΠΏΠ°ΡΡΠ²Π°ΡΠ΅ Π½Π° ΡΡΠ°ΡΠΈΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π·Π° Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡΠ°, ΠΊΠΎΠ³Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ Π³ΠΎ ΠΊΠΎΠΏΠΈΡΠ°Π» ΠΊΠΎΠ΄ΠΎΡ ΠΎΠ΄ ΠΏΡΠ΅Π»ΠΈΡΡΡΠ²Π°ΡΠΎΡ Π²ΠΎ ΡΠΊΡΠΈΠΏΡΠ°ΡΠ°),
ΠΎΠΏΡΠ΅Π³ΠΎΡ Π³ΠΎ ΠΎΠ·Π½Π°ΡΡΠ²Π° ΠΎΠ±Π΅ΠΌΠΎΡ ΠΈ Π²ΠΈΠ΄ΠΎΡ Π½Π° ΠΏΡΠΈΡΡΠ°ΠΏΠΎΡ. Π’ΠΈΠ΅ ΠΌΠΎΡΠ° Π΄Π° Π±ΠΈΠ΄Π°Ρ ΠΎΠ΄Π΄Π΅Π»Π΅Π½ΠΈ ΡΠΎ ΠΏΡΠ°Π·Π½ΠΈ ΠΌΠ΅ΡΡΠ° ΠΈΠ»ΠΈ %20 (ΡΠΏΠΎΡΠ΅Π΄ ΠΊΠΎΠ΄ΠΈΡΠ°ΡΠ΅ΡΠΎ Π½Π° URL-ΡΠΎ). Π‘ΠΏΠΈΡΠΎΠΊΠΎΡ Π½Π° ΠΎΠ±Π»Π°ΡΡΠΈ Π·Π° ΠΏΡΠΈΡΡΠ°ΠΏ ΡΠΎ ΡΠΈΠΏΠΎΠ²ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π²ΠΈΠ΄ΠΈ ΠΎΠ²Π΄Π΅:
ΠΠΎ Π΄ΠΎΠ±ΠΈΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠ΄ΠΎΡ Π·Π° Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡΠ°, Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° ΡΠ΅ Π²ΡΠ°ΡΠΈ Π±Π»ΠΈΡΠΊΠ° ΠΏΠΎΡΠ°ΠΊΠ° Π΄ΠΎ ΠΏΡΠ΅Π»ΠΈΡΡΡΠ²Π°ΡΠΎΡ, ΡΠ΅ ΠΏΡΠ΅ΡΡΠ°Π½Π΅ Π΄Π° ΡΠ»ΡΡΠ° Π½Π° ΠΏΠΎΡΡΠ°ΡΠ° ΠΈ ΡΠ΅ ΠΈΡΠΏΡΠ°ΡΠΈ Π±Π°ΡΠ°ΡΠ΅ POST Π·Π° Π΄Π° Π³ΠΎ Π΄ΠΎΠ±ΠΈΠ΅ ΡΠΎΠΊΠ΅Π½ΠΎΡ. ΠΠΎ Π½Π΅Π³ΠΎ Π³ΠΎ ΠΎΠ·Π½Π°ΡΡΠ²Π°ΠΌΠ΅ ΠΏΡΠ΅ΡΡ ΠΎΠ΄Π½ΠΎ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΠΎΡ ID ΠΈ ΡΠ°ΡΠ½Π°ΡΠ° ΠΎΠ΄ API Π½Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ°, Π°Π΄ΡΠ΅ΡΠ°ΡΠ° Π½Π° ΠΊΠΎΡΠ° ΡΠ΅ Π±ΠΈΠ΄Π΅ ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ΅Π½ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ ΠΈ grant_type Π²ΠΎ ΡΠΎΠ³Π»Π°ΡΠ½ΠΎΡΡ ΡΠΎ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΡ.
ΠΠ°ΠΊΠΎ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ, ΡΠ΅ Π΄ΠΎΠ±ΠΈΠ΅ΠΌΠ΅ ΡΠΎΠΊΠ΅Π½ Π·Π° ΠΏΡΠΈΡΡΠ°ΠΏ, Π½Π΅Π³ΠΎΠ²ΠΈΠΎΡ ΠΏΠ΅ΡΠΈΠΎΠ΄ Π½Π° Π²Π°ΠΆΠ½ΠΎΡΡ Π²ΠΎ ΡΠ΅ΠΊΡΠ½Π΄ΠΈ ΠΈ ΡΠΎΠΊΠ΅Π½ Π·Π° ΠΎΡΠ²Π΅ΠΆΡΠ²Π°ΡΠ΅, ΡΠΎ ΠΊΠΎΡ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΎ Π°ΠΆΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠΎΠΊΠ΅Π½ΠΎΡ Π·Π° ΠΏΡΠΈΡΡΠ°ΠΏ.
ΠΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° ΠΌΠΎΡΠ° Π΄Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ° ΡΠΎΠΊΠ΅Π½ΠΈ Π½Π° Π±Π΅Π·Π±Π΅Π΄Π½ΠΎ ΠΌΠ΅ΡΡΠΎ ΡΠΎ Π΄ΠΎΠ»Π³ ΡΠΎΠΊ Π½Π° ΡΡΠ°Π΅ΡΠ΅, ΡΠ°ΠΊΠ° ΡΡΠΎ Π΄ΠΎΠ΄Π΅ΠΊΠ° Π½Π΅ Π³ΠΎ ΠΎΡΠΏΠΎΠ²ΠΈΠΊΠ°ΠΌΠ΅ Π΄ΠΎΠ±ΠΈΠ΅Π½ΠΈΠΎΡ ΠΏΡΠΈΡΡΠ°ΠΏ, Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° Π½Π΅ΠΌΠ° Π΄Π° Π³ΠΎ Π²ΡΠ°ΡΠΈ ΡΠΎΠΊΠ΅Π½ΠΎΡ Π·Π° ΠΎΡΠ²Π΅ΠΆΡΠ²Π°ΡΠ΅. ΠΠ° ΠΊΡΠ°ΡΠΎΡ, Π΄ΠΎΠ΄Π°Π΄ΠΎΠ² Π±Π°ΡΠ°ΡΠ΅ Π·Π° ΠΎΡΠΏΠΎΠ²ΠΈΠΊΡΠ²Π°ΡΠ΅ Π½Π° ΡΠΎΠΊΠ΅Π½ΠΎΡ; Π°ΠΊΠΎ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° Π½Π΅ Π±Π΅ΡΠ΅ ΡΡΠΏΠ΅ΡΠ½ΠΎ Π·Π°Π²ΡΡΠ΅Π½Π° ΠΈ ΡΠΎΠΊΠ΅Π½ΠΎΡ Π·Π° ΠΎΡΠ²Π΅ΠΆΡΠ²Π°ΡΠ΅ Π½Π΅ Π±Π΅ΡΠ΅ Π²ΡΠ°ΡΠ΅Π½, ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΡΠ΅ ΡΠ° Π·Π°ΠΏΠΎΡΠ½Π΅ ΠΏΠΎΡΡΠ°ΠΏΠΊΠ°ΡΠ° (ΡΠΌΠ΅ΡΠ°Π²ΠΌΠ΅ Π΄Π΅ΠΊΠ° Π΅ Π½Π΅Π±Π΅Π·Π±Π΅Π΄Π½ΠΎ Π΄Π° ΡΠ΅ ΡΠΊΠ»Π°Π΄ΠΈΡΠ°Π°Ρ ΡΠΎΠΊΠ΅Π½ΠΈ Π»ΠΎΠΊΠ°Π»Π½ΠΎ Π½Π° ΡΠ΅ΡΠΌΠΈΠ½Π°Π»ΠΎΡ ΠΈ Π½Π΅ Π½Π΅ ΡΠ°ΠΊΠ°ΠΌ Π΄Π° Π³ΠΈ ΠΊΠΎΠΌΠΏΠ»ΠΈΡΠΈΡΠ°ΠΌ ΡΠ°Π±ΠΎΡΠΈΡΠ΅ ΡΠΎ ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΈΡΠ°ΡΠ° ΠΈΠ»ΠΈ ΡΠ΅ΡΡΠΎ Π΄Π° Π³ΠΎ ΠΎΡΠ²ΠΎΡΠ°ΠΌ ΠΏΡΠ΅Π»ΠΈΡΡΡΠ²Π°ΡΠΎΡ).
do {
$token_result = Get-GoogleAuthToken
$token = $token_result.access_token
if ($token_result.refresh_token -eq $null) {
Write-Host ("Session is not destroyed. Revoking token...")
Invoke-WebRequest -Uri ("https://accounts.google.com/o/oauth2/revoke?token="+$token)
}
} while ($token_result.refresh_token -eq $null)
$refresh_token = $token_result.refresh_token
$minute = ([int]("{0:mm}" -f ([timespan]::fromseconds($token_result.expires_in))))+((Get-date).Minute)-2
if ($minute -lt 0) {$minute += 60}
elseif ($minute -gt 59) {$minute -=60}
$token_expire = @{
hour = ([int]("{0:hh}" -f ([timespan]::fromseconds($token_result.expires_in))))+((Get-date).Hour)
minute = $minute
}
ΠΠ°ΠΊΠΎ ΡΡΠΎ Π²Π΅ΡΠ΅ Π·Π°Π±Π΅Π»Π΅ΠΆΠ°Π²ΡΠ΅, ΠΏΡΠΈ ΠΎΡΠΏΠΎΠ²ΠΈΠΊΡΠ²Π°ΡΠ΅ Π½Π° ΡΠΎΠΊΠ΅Π½, ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Invoke-WebRequest. ΠΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΎΠ΄ Invoke-RestMethod, ΡΠΎΡ Π½Π΅ Π³ΠΈ Π²ΡΠ°ΡΠ° ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π²ΠΎ ΡΠΏΠΎΡΡΠ΅Π±Π»ΠΈΠ² ΡΠΎΡΠΌΠ°Ρ ΠΈ Π³ΠΎ ΠΏΡΠΈΠΊΠ°ΠΆΡΠ²Π° ΡΡΠ°ΡΡΡΠΎΡ Π½Π° Π±Π°ΡΠ°ΡΠ΅ΡΠΎ.
Π‘Π»Π΅Π΄Π½ΠΎ, ΡΠΊΡΠΈΠΏΡΠ°ΡΠ° Π±Π°ΡΠ° ΠΎΠ΄ Π²Π°Ρ Π΄Π° Π³ΠΈ Π²Π½Π΅ΡΠ΅ΡΠ΅ ΠΈΠΌΠ΅ΡΠΎ ΠΈ ΠΏΡΠ΅Π·ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ, Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΡΠΈ Π½Π°ΡΠ°Π²Π° + Π΅-ΠΏΠΎΡΡΠ°.
ΠΠ°ΡΠ°ΡΠ°
Π‘Π»Π΅Π΄Π½ΠΈΡΠ΅ Π±Π°ΡΠ°ΡΠ° ΡΠ΅ Π±ΠΈΠ΄Π°Ρ - ΠΏΡΠ΅Π΄ ΡΓ¨, ΡΡΠ΅Π±Π° Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΡΠ΅ Π΄Π°Π»ΠΈ Π²Π΅ΡΠ΅ ΠΏΠΎΡΡΠΎΠΈ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ ΡΠΎ ΠΈΡΡΠ° Π½Π°ΡΠ°Π²Π° Π·Π° Π΄Π° ΡΠ΅ Π΄ΠΎΠ±ΠΈΠ΅ ΠΎΠ΄Π»ΡΠΊΠ° Π·Π° ΡΠΎΠ·Π΄Π°Π²Π°ΡΠ΅ Π½Π° Π½ΠΎΠ² ΠΈΠ»ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π°ΡΠ΅ Π½Π° ΡΠ΅ΠΊΠΎΠ²Π½ΠΈΠΎΡ.
Π Π΅ΡΠΈΠ² Π΄Π° Π³ΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°ΠΌ ΡΠΈΡΠ΅ Π±Π°ΡΠ°ΡΠ° Π²ΠΎ ΡΠΎΡΠΌΠ°Ρ Π½Π° Π΅Π΄Π½Π° ΡΡΠ½ΠΊΡΠΈΡΠ° ΡΠΎ ΠΈΠ·Π±ΠΎΡ, ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΠΏΡΠ΅ΠΊΠΈΠ½ΡΠ²Π°Ρ:
function GoogleQuery {
param (
$type,
$query
)
switch ($type) {
"SearchAccount" {
Return Invoke-RestMethod -Method Get -Uri "https://www.googleapis.com/admin/directory/v1/users" -Headers @{Authorization = "Bearer "+(Get-GoogleToken)} -Body @{
domain = 'rocketguys.com'
query = "email:$query"
}
}
"UpdateAccount" {
$body = @{
name = @{
givenName = $query['givenName']
familyName = $query['familyName']
}
suspended = 'false'
password = $query['password']
changePasswordAtNextLogin = 'true'
phones = @(@{
primary = 'true'
value = $query['phone']
type = "mobile"
})
orgUnitPath = $query['orgunit']
}
Return Invoke-RestMethod -Method Put -Uri ("https://www.googleapis.com/admin/directory/v1/users/"+$query['email']) -Headers @{Authorization = "Bearer "+(Get-GoogleToken)} -Body (ConvertTo-Json $body) -ContentType 'application/json; charset=utf-8'
}
"CreateAccount" {
$body = @{
primaryEmail = $query['email']
name = @{
givenName = $query['givenName']
familyName = $query['familyName']
}
suspended = 'false'
password = $query['password']
changePasswordAtNextLogin = 'true'
phones = @(@{
primary = 'true'
value = $query['phone']
type = "mobile"
})
orgUnitPath = $query['orgunit']
}
Return Invoke-RestMethod -Method Post -Uri "https://www.googleapis.com/admin/directory/v1/users" -Headers @{Authorization = "Bearer "+(Get-GoogleToken)} -Body (ConvertTo-Json $body) -ContentType 'application/json; charset=utf-8'
}
"AddMember" {
$body = @{
userKey = $query['email']
}
$ifrequest = Invoke-RestMethod -Method Get -Uri "https://www.googleapis.com/admin/directory/v1/groups" -Headers @{Authorization = "Bearer "+(Get-GoogleToken)} -Body $body
$array = @()
foreach ($group in $ifrequest.groups) {$array += $group.email}
if ($array -notcontains $query['groupkey']) {
$body = @{
email = $query['email']
role = "MEMBER"
}
Return Invoke-RestMethod -Method Post -Uri ("https://www.googleapis.com/admin/directory/v1/groups/"+$query['groupkey']+"/members") -Headers @{Authorization = "Bearer "+(Get-GoogleToken)} -Body (ConvertTo-Json $body) -ContentType 'application/json; charset=utf-8'
} else {
Return ($query['email']+" now is a member of "+$query['groupkey'])
}
}
}
}
ΠΠΎ ΡΠ΅ΠΊΠΎΠ΅ Π±Π°ΡΠ°ΡΠ΅, ΡΡΠ΅Π±Π° Π΄Π° ΠΈΡΠΏΡΠ°ΡΠΈΡΠ΅ Π·Π°Π³Π»Π°Π²ΠΈΠ΅ Π·Π° Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡΠ° ΡΡΠΎ Π³ΠΎ ΡΠΎΠ΄ΡΠΆΠΈ ΡΠΈΠΏΠΎΡ Π½Π° ΡΠΎΠΊΠ΅Π½ ΠΈ ΡΠ°ΠΌΠΈΠΎΡ ΡΠΎΠΊΠ΅Π½ Π·Π° ΠΏΡΠΈΡΡΠ°ΠΏ. ΠΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠ², ΡΠΈΠΏΠΎΡ Π½Π° ΡΠΎΠΊΠ΅Π½ Π΅ ΡΠ΅ΠΊΠΎΠ³Π°Ρ Π½ΠΎΡΠΈΡΠ΅Π». ΠΠΈΠ΄Π΅ΡΡΠΈ ΡΡΠ΅Π±Π° Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌΠ΅ Π΄Π°Π»ΠΈ ΡΠΎΠΊΠ΅Π½ΠΎΡ Π½Π΅ Π΅ ΠΈΡΡΠ΅ΡΠ΅Π½ ΠΈ Π΄Π° Π³ΠΎ Π°ΠΆΡΡΠΈΡΠ°ΠΌΠ΅ ΠΏΠΎ Π΅Π΄Π΅Π½ ΡΠ°Ρ ΠΎΠ΄ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΡ Π½Π° ΠΈΠ·Π΄Π°Π²Π°ΡΠ΅, Π½Π°Π²Π΅Π΄ΠΎΠ² Π±Π°ΡΠ°ΡΠ΅ Π·Π° Π΄ΡΡΠ³Π° ΡΡΠ½ΠΊΡΠΈΡΠ° ΡΡΠΎ Π²ΡΠ°ΡΠ° ΡΠΎΠΊΠ΅Π½ Π·Π° Access. ΠΡΡΠΈΠΎΡ Π΄Π΅Π» ΠΎΠ΄ ΠΊΠΎΠ΄ΠΎΡ Π΅ Π½Π° ΠΏΠΎΡΠ΅ΡΠΎΠΊΠΎΡ Π½Π° ΡΠΊΡΠΈΠΏΡΠ°ΡΠ° ΠΏΡΠΈ ΠΏΡΠΈΠΌΠ°ΡΠ΅ΡΠΎ Π½Π° ΠΏΡΠ²ΠΈΠΎΡ ΡΠΎΠΊΠ΅Π½ Π·Π° ΠΏΡΠΈΡΡΠ°ΠΏ:
function Get-GoogleToken {
if (((Get-date).Hour -gt $token_expire.hour) -or (((Get-date).Hour -ge $token_expire.hour) -and ((Get-date).Minute -gt $token_expire.minute))) {
Write-Host "Token Expired. Refreshing..."
$request = (Invoke-RestMethod -Method Post -Uri "https://www.googleapis.com/oauth2/v4/token" -ContentType 'application/x-www-form-urlencoded' -Body @{
client_id = $client_id
client_secret = $client_secret
refresh_token = $refresh_token
grant_type = 'refresh_token'
})
$token = $request.access_token
$minute = ([int]("{0:mm}" -f ([timespan]::fromseconds($request.expires_in))))+((Get-date).Minute)-2
if ($minute -lt 0) {$minute += 60}
elseif ($minute -gt 59) {$minute -=60}
$script:token_expire = @{
hour = ([int]("{0:hh}" -f ([timespan]::fromseconds($request.expires_in))))+((Get-date).Hour)
minute = $minute
}
}
return $token
}
ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π½Π°ΡΠ°Π²Π°ΡΠ° Π·Π° ΠΏΠΎΡΡΠΎΠ΅ΡΠ΅:
function Check_Google {
$query = (GoogleQuery 'SearchAccount' $username)
if ($query.users -ne $null) {
$user = $query.users[0]
Write-Host $user.name.fullName' - '$user.PrimaryEmail' - suspended: '$user.Suspended
$GAresult = $user
}
if ($GAresult) {
$return = $GAresult
} else {$return = 'gg'}
return $return
}
ΠΠ°ΡΠ°ΡΠ΅ΡΠΎ email:$query ΡΠ΅ ΠΏΠΎΠ±Π°ΡΠ° ΠΎΠ΄ API Π΄Π° Π±Π°ΡΠ° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ ΡΠΎ ΡΠΎΠΊΠΌΡ ΡΠ°Π° Π΅-ΠΏΠΎΡΡΠ°, Π²ΠΊΠ»ΡΡΡΠ²Π°ΡΡΠΈ ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΠΈ. ΠΠΎΠΆΠ΅ Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ ΠΈ ΡΠΎΠΊΠ΅Ρ: =, :, :{ΠΠ ΠΠ€ΠΠΠ‘}*.
ΠΠ° Π΄Π° Π΄ΠΎΠ±ΠΈΠ΅ΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π³ΠΎ ΠΌΠ΅ΡΠΎΠ΄ΠΎΡ Π½Π° Π±Π°ΡΠ°ΡΠ΅ GET, Π·Π° Π²ΠΌΠ΅ΡΠ½ΡΠ²Π°ΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ (ΡΠΎΠ·Π΄Π°Π²Π°ΡΠ΅ ΡΠΌΠ΅ΡΠΊΠ° ΠΈΠ»ΠΈ Π΄ΠΎΠ΄Π°Π²Π°ΡΠ΅ ΡΠ»Π΅Π½ Π²ΠΎ Π³ΡΡΠΏΠ°) - ΠΠΠ‘Π’ΠΠΠΠ’Π, Π·Π° Π°ΠΆΡΡΠΈΡΠ°ΡΠ΅ ΠΏΠΎΡΡΠΎΠ΅ΡΠΊΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ - PUT, Π·Π° Π±ΡΠΈΡΠ΅ΡΠ΅ Π·Π°ΠΏΠΈΡ (Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ»Π΅Π½ ΠΎΠ΄ Π³ΡΡΠΏΠ°) - ΠΠΠΠ ΠΠ¨Π.
Π‘ΠΊΡΠΈΠΏΡΠ°ΡΠ° ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ΅ Π±Π°ΡΠ° ΡΠ΅Π»Π΅ΡΠΎΠ½ΡΠΊΠΈ Π±ΡΠΎΡ (Π½Π΅ΠΏΠΎΡΠ²ΡΠ΄Π΅Π½Π° Π½ΠΈΠ·Π°) ΠΈ Π²ΠΊΠ»ΡΡΡΠ²Π°ΡΠ΅ Π²ΠΎ ΡΠ΅Π³ΠΈΠΎΠ½Π°Π»Π½Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ²Π½Π° Π³ΡΡΠΏΠ°. Π’ΠΎΡ ΠΎΠ΄Π»ΡΡΡΠ²Π° ΠΊΠΎΡΠ° ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡΠΊΠ° Π΅Π΄ΠΈΠ½ΠΈΡΠ° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ° ΠΈΠΌΠ° Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΠΈΠ·Π±ΡΠ°Π½ΠΈΠΎΡ OU Π½Π° Active Directory ΠΈ Π΄ΠΎΠ°ΡΠ° ΡΠΎ Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°:
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"
Π ΡΠΎΠ³Π°Ρ ΡΠΎΡ ΠΏΠΎΡΠ½ΡΠ²Π° Π΄Π° ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠ° ΡΠΎ ΡΠΌΠ΅ΡΠΊΠ°ΡΠ°:
$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
}
Π€ΡΠ½ΠΊΡΠΈΠΈΡΠ΅ Π·Π° Π°ΠΆΡΡΠΈΡΠ°ΡΠ΅ ΠΈ ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΡΠΌΠ΅ΡΠΊΠ° ΠΈΠΌΠ°Π°Ρ ΡΠ»ΠΈΡΠ½Π° ΡΠΈΠ½ΡΠ°ΠΊΡΠ°; Π½Π΅ ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈ ΡΠΈΡΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΠΏΠΎΠ»ΠΈΡΠ°; Π²ΠΎ Π΄Π΅Π»ΠΎΡ ΡΠΎ ΡΠ΅Π»Π΅ΡΠΎΠ½ΡΠΊΠΈ Π±ΡΠΎΠ΅Π²ΠΈ, ΡΡΠ΅Π±Π° Π΄Π° Π½Π°Π²Π΅Π΄Π΅ΡΠ΅ Π½ΠΈΠ·Π° ΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠΎΠ΄ΡΠΆΠΈ Π΄ΠΎ Π΅Π΄Π΅Π½ Π·Π°ΠΏΠΈΡ ΡΠΎ Π±ΡΠΎΡΠΎΡ ΠΈ Π½Π΅Π³ΠΎΠ²ΠΈΠΎΡ ΡΠΈΠΏ.
ΠΠ° Π΄Π° Π½Π΅ Π΄ΠΎΠ±ΠΈΠ΅ΠΌΠ΅ Π³ΡΠ΅ΡΠΊΠ° ΠΏΡΠΈ Π΄ΠΎΠ΄Π°Π²Π°ΡΠ΅ Π½Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ Π²ΠΎ Π³ΡΡΠΏΠ°, ΠΏΡΠ²ΠΎ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌΠ΅ Π΄Π°Π»ΠΈ ΡΠΎΡ Π΅ Π²Π΅ΡΠ΅ ΡΠ»Π΅Π½ Π½Π° ΠΎΠ²Π°Π° Π³ΡΡΠΏΠ° ΡΠΎ Π΄ΠΎΠ±ΠΈΠ²Π°ΡΠ΅ Π»ΠΈΡΡΠ° Π½Π° ΡΠ»Π΅Π½ΠΎΠ²ΠΈ Π½Π° Π³ΡΡΠΏΠ°ΡΠ° ΠΈΠ»ΠΈ ΡΠΎΡΡΠ°Π² ΠΎΠ΄ ΡΠ°ΠΌΠΈΠΎΡ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ.
ΠΡΠ°ΡΠ°ΡΠ΅ΡΠΎ Π·Π° ΡΠ»Π΅Π½ΡΡΠ²ΠΎΡΠΎ Π²ΠΎ Π³ΡΡΠΏΠ°ΡΠ° Π½Π° ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ Π½Π΅ΠΌΠ° Π΄Π° Π±ΠΈΠ΄Π΅ ΡΠ΅ΠΊΡΡΠ·ΠΈΠ²Π½ΠΎ ΠΈ ΡΠ΅ ΠΏΡΠΈΠΊΠ°ΠΆΡΠ²Π° ΡΠ°ΠΌΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΡΠ»Π΅Π½ΡΡΠ²ΠΎ. ΠΠ΅ ΡΡΠΏΠ΅Π΅ Π΄Π° Π²ΠΊΠ»ΡΡΠΈΡΠ΅ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ Π²ΠΎ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΠΊΠ° Π³ΡΡΠΏΠ° ΠΊΠΎΡΠ° Π²Π΅ΡΠ΅ ΠΈΠΌΠ° Π΄Π΅ΡΡΠΊΠ° Π³ΡΡΠΏΠ° Π²ΠΎ ΠΊΠΎΡΠ° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ Π΅ ΡΠ»Π΅Π½.
ΠΠ°ΠΊΠ»ΡΡΠΎΠΊ
ΠΡΡΠ°Π½ΡΠ²Π° ΡΠ°ΠΌΠΎ Π΄Π° ΠΌΡ ΡΠ° ΠΈΡΠΏΡΠ°ΡΠΈ Π½Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°ΡΠ° Π·Π° Π½ΠΎΠ²Π°ΡΠ° ΡΠΌΠ΅ΡΠΊΠ°. ΠΠ²Π° Π³ΠΎ ΠΏΡΠ°Π²ΠΈΠΌΠ΅ ΠΏΡΠ΅ΠΊΡ Π‘ΠΠ‘ ΠΈ ΠΈΡΠΏΡΠ°ΡΠ°ΠΌΠ΅ ΠΎΠΏΡΡΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΡΠΎ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΈ Π½Π°ΡΠ°Π²ΡΠ²Π°ΡΠ΅ Π½Π° Π»ΠΈΡΠ½Π° Π΅-ΠΏΠΎΡΡΠ°, ΠΊΠΎΡΠ° Π·Π°Π΅Π΄Π½ΠΎ ΡΠΎ ΡΠ΅Π»Π΅ΡΠΎΠ½ΡΠΊΠΈΠΎΡ Π±ΡΠΎΡ Π΅ ΠΎΠ±Π΅Π·Π±Π΅Π΄Π΅Π½Π° ΠΎΠ΄ ΠΎΠ΄Π΄Π΅Π»ΠΎΡ Π·Π° ΡΠ΅Π³ΡΡΡΠΈΡΠ°ΡΠ΅. ΠΠ°ΠΊΠΎ Π°Π»ΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π·Π°ΡΡΠ΅Π΄ΠΈΡΠ΅ ΠΏΠ°ΡΠΈ ΠΈ Π΄Π° ΡΠ° ΠΈΡΠΏΡΠ°ΡΠΈΡΠ΅ Π²Π°ΡΠ°ΡΠ° Π»ΠΎΠ·ΠΈΠ½ΠΊΠ° Π½Π° ΡΠ°Π΅Π½ ΡΠ΅Π»Π΅Π³ΡΠ°ΠΌΡΠΊΠΈ ΡΠ°Π·Π³ΠΎΠ²ΠΎΡ, ΡΡΠΎ ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠΌΠ΅ΡΠ° Π·Π° Π²ΡΠΎΡ ΡΠ°ΠΊΡΠΎΡ (MacBooks ΡΠ΅ Π±ΠΈΠ΄Π΅ ΠΈΡΠΊΠ»ΡΡΠΎΠΊ).
ΠΠΈ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠΈΠΌΠ΅ ΡΡΠΎ ΠΏΡΠΎΡΠΈΡΠ°Π²ΡΠ΅ Π΄ΠΎ ΠΊΡΠ°Ρ. ΠΠ΅ ΠΌΠΈ Π±ΠΈΠ΄Π΅ Π΄ΡΠ°Π³ΠΎ Π΄Π° Π²ΠΈΠ΄Π°ΠΌ ΠΏΡΠ΅Π΄Π»ΠΎΠ·ΠΈ Π·Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°ΡΠ΅ Π½Π° ΡΡΠΈΠ»ΠΎΡ Π½Π° ΠΏΠΈΡΡΠ²Π°ΡΠ΅ Π½Π°ΠΏΠΈΡΠΈ ΠΈ Π²ΠΈ ΠΏΠΎΡΠ°ΠΊΡΠ²Π°ΠΌ Π΄Π° ΡΠ°ΡΠΈΡΠ΅ ΠΏΠΎΠΌΠ°Π»ΠΊΡ Π³ΡΠ΅ΡΠΊΠΈ ΠΏΡΠΈ ΠΏΠΈΡΡΠ²Π°ΡΠ΅ ΡΠΊΡΠΈΠΏΡΠΈ =)
Π‘ΠΏΠΈΡΠΎΠΊ Π½Π° Π²ΡΡΠΊΠΈ ΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π°Ρ ΡΠ΅ΠΌΠ°ΡΡΠΊΠΈ ΠΊΠΎΡΠΈΡΠ½ΠΈ ΠΈΠ»ΠΈ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ Π΄Π° ΠΎΠ΄Π³ΠΎΠ²ΠΎΡΠ°Ρ Π½Π° ΠΏΡΠ°ΡΠ°ΡΠ°:
OAuth 2.0 Π·Π° ΠΌΠΎΠ±ΠΈΠ»Π½ΠΈ ΠΈ Π΄Π΅ΡΠΊΡΠΎΠΏ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ ΠΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° OAuth 2.0 Π·Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ Π·Π° Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅Ρ ΠΠΎΠΊΠ°Π·Π΅Π½ ΠΊΠ»ΡΡ Π·Π° ΡΠ°Π·ΠΌΠ΅Π½Π° Π½Π° ΠΊΠΎΠ΄ ΠΎΠ΄ ΡΠ°Π²Π½ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠΈ Π½Π° OAuth ΠΠ΅Π½Π΅ΡΠΈΡΠ°ΡΡΠ΅ ΡΠ»ΡΡΠ°ΡΠ½ΠΈ Π±ΡΠΊΠ²ΠΈ ΡΠΎ PowerShell Π’Π°Π±Π΅Π»Π° ΠΈ ΠΎΠΏΠΈΡ Π½Π° ASCII PowerShell: ΠΠΎΠ±ΠΈΠ²Π°ΡΠ΅ Ρ Π°Ρ Π²ΡΠ΅Π΄Π½ΠΎΡΡ Π·Π° Π½ΠΈΠ·Π° ΠΠΎΠ΄ΠΈΡΠ°Ρ/ΠΠ΅ΠΊΠΎΠ΄ΠΈΡΠ°Ρ Base64Url ΠΠΎΠ΄ΠΈΡΠ°ΡΠ΅ Base64 Π½Π°ΡΠΏΡΠΎΡΠΈ ΠΊΠΎΠ΄ΠΈΡΠ°ΡΠ΅ Base64url Invoke-RestMethod Π²ΠΎ PowerShell 5.1 ΠΠ΅ ΡΠ΅ Π΄ΠΎΠ±ΠΈΠ²Π° ΡΠΎΠΊΠ΅Π½ Π·Π° ΠΎΡΠ²Π΅ΠΆΡΠ²Π°ΡΠ΅ ΠΈΠ°ΠΊΠΎ access_type Π΅ ΠΎΡΠ»Π°ΡΠ½ Π²ΠΎ ΡΠ΅ΠΊΠΎΡ 1 ΠΠ° ΡΠΏΠΎΡΠ΅Π΄Π±Π΅Π½ΠΈΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΈ ΠΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌ API: ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈ ΡΠΌΠ΅ΡΠΊΠΈ ΠΡΠ΅Π±Π°ΡΠ°ΡΡΠ΅ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΈ ΠΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌ API: ΠΡΡΠΏΠΈ Π Π°ΠΊΡΠ²Π°ΡΠ΅ ΡΠΎ Π³ΡΠ΅ΡΠΊΠΈ Π·Π° Invoke-RestMethod - Powershell
ΠΠ·Π²ΠΎΡ: www.habr.com