рдирдорд╕реНрддреЗ!
рдпрд╕ рд▓реЗрдЦрд▓реЗ G Suite рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрд▓рд╛рдИ рд╣реЗрд░рдлреЗрд░ рдЧрд░реНрди Google API рд╕рдБрдЧ PowerShell рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХреЛ рд╡рд░реНрдгрди рдЧрд░реНрдиреЗрдЫред
рд╣рд╛рдореА рд╕рдВрдЧрдарди рднрд░рд┐ рдзреЗрд░реИ рдЖрдиреНрддрд░рд┐рдХ рд░ рдХреНрд▓рд╛рдЙрдб рд╕реЗрд╡рд╛рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫреМрдВред рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧрдХреЛ рд▓рд╛рдЧрд┐, рддрд┐рдиреАрд╣рд░реВрдорд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг Google рд╡рд╛ рд╕рдХреНрд░рд┐рдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдорд╛ рдЖрдЙрдБрдЫ, рдЬрд╕рдХреЛ рдмреАрдЪрдорд╛ рд╣рд╛рдореА рдкреНрд░рддрд┐рдХреГрддрд┐ рдХрд╛рдпрдо рдЧрд░реНрди рд╕рдХреНрджреИрдиреМрдВ; рддрджрдиреБрд╕рд╛рд░, рдЬрдм рдирдпрд╛рдБ рдХрд░реНрдордЪрд╛рд░реА рдЫреЛрдбреНрдЫ, рддрдкрд╛рдИрдВрд▓реЗ рдпреА рджреБрдИ рдкреНрд░рдгрд╛рд▓реАрд╣рд░реВрдорд╛ рдЦрд╛рддрд╛ рд╕рд┐рд░реНрдЬрдирд╛/рд╕рдХреНрд╖рдо рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдмрдирд╛рдЙрди, рд╣рд╛рдореАрд▓реЗ рдЬрд╛рдирдХрд╛рд░реА рд╕рдЩреНрдХрд▓рди рдЧрд░реНрдиреЗ рд░ рджреБрдмреИ рд╕реЗрд╡рд╛рд╣рд░реВрдорд╛ рдкрдард╛рдЙрдиреЗ рд▓рд┐рдкрд┐ рд▓реЗрдЦреНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реНрдпреМрдВред
рдкреНрд░рд╛рдзрд┐рдХрд░рдг
рдЖрд╡рд╢реНрдпрдХрддрд╛рд╣рд░реВ рдХреЛрд░реНрджрд╛, рд╣рд╛рдореАрд▓реЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдгрдХреЛ рд▓рд╛рдЧрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдирд╡ рдкреНрд░рд╢рд╛рд╕рдХрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реНрдпреМрдВ; рдпрд╕рд▓реЗ рдЖрдХрд╕реНрдорд┐рдХ рд╡рд╛ рдЬрд╛рдирд╛рдЬрд╛рдиреА рдареВрд▓реЛ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВрдХреЛ рдШрдЯрдирд╛рдорд╛ рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд▓рд╛рдИ рд╕рд░рд▓ рдмрдирд╛рдЙрдБрдЫред
Google API рд▓реЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдгрдХреЛ рд▓рд╛рдЧрд┐ OAuth 2.0 рдкреНрд░реЛрдЯреЛрдХрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫред рдХреЗрд╕рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рдердк рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдгрд╣рд░реВ рдпрд╣рд╛рдБ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХрд┐рдиреНрдЫ:
рдореИрд▓реЗ рдбреЗрд╕реНрдХрдЯрдк рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрдорд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдгрдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░реЛрдЬреЗрдВред рддреНрдпрд╣рд╛рдБ рд╕реЗрд╡рд╛ рдЦрд╛рддрд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рд╡рд┐рдХрд▓реНрдк рдкрдирд┐ рдЫ, рдЬрд╕рд▓рд╛рдИ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдмрд╛рдЯ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЪрд╛рд▓рд╣рд░реВ рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрджреИрдиред
рддрд▓рдХреЛ рдЪрд┐рддреНрд░ рдЧреБрдЧрд▓ рдкреГрд╖реНрдардмрд╛рдЯ рдЪрдпрди рдЧрд░рд┐рдПрдХреЛ рдкрд░рд┐рджреГрд╢реНрдпрдХреЛ рдпреЛрдЬрдирд╛рдмрджреНрдз рд╡рд┐рд╡рд░рдг рд╣реЛред
- рдкрд╣рд┐рд▓реЗ, рд╣рд╛рдореА рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд▓рд╛рдИ 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 рдЧреНрд░рд╛рд╣рдХ рдкрд╣рд┐рдЪрд╛рдирдХрд░реНрддрд╛ рдЧреБрдгрд╣рд░реВрдорд╛ рдкреНрд░рд╛рдкреНрдд рдЧреНрд░рд╛рд╣рдХ ID рд░ рдЧреНрд░рд╛рд╣рдХ рдЧреЛрдкреНрдп рд╕реЗрдЯ рдЧрд░реНрдЫреМрдВ, рд░ рдХреЛрдб рдкреНрд░рдорд╛рдгрд┐рдХрд░рдг 43 рджреЗрдЦрд┐ 128 рд╡рд░реНрдгрд╣рд░реВрдХреЛ рд╕реНрдЯреНрд░рд┐рдЩ рд╣реЛ рдЬреБрди рдЕрдирд┐рдпрдорд┐рдд рд░реВрдкрдорд╛ рдЕрдирд╛рд░рдХреНрд╖рд┐рдд рд╡рд░реНрдгрд╣рд░реВрдмрд╛рдЯ рдЙрддреНрдкрдиреНрди рд╣реБрдиреБрдкрд░реНрдЫ: [AZ] / [az] / [0-9 ] / "-" / "ред" / "_" / "~"ред
рдпреЛ рдХреЛрдб рдлреЗрд░рд┐ рдкреНрд░рд╕рд╛рд░рдг рд╣реБрдиреЗрдЫред рдпрд╕рд▓реЗ рднреЗрджреНрдпрддрд╛рд▓рд╛рдИ рд╣рдЯрд╛рдЙрдБрдЫ рдЬрд╕рдорд╛ рдЖрдХреНрд░рдордгрдХрд╛рд░реАрд▓реЗ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдХреЛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкрдЫрд┐ рд░рд┐рдбрд┐рд░реЗрдХреНрдЯрдХреЛ рд░реВрдкрдорд╛ рдлрд░реНрдХрд╛рдЗрдПрдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рд░реЛрдХреНрди рд╕рдХреНрдЫред
рддрдкрд╛рдИрдВрд▓реЗ рд╣рд╛рд▓рдХреЛ рдЕрдиреБрд░реЛрдзрдорд╛ рд╕реНрдкрд╖реНрдЯ рдкрд╛рдардорд╛ рдХреЛрдб рдкреНрд░рдорд╛рдгрд┐рдХрд░рдг рдкрдард╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ (рдЬрд╕рд▓реЗ рдпрд╕рд▓рд╛рдИ рдЕрд░реНрдерд╣реАрди рдмрдирд╛рдЙрдБрдЫ - рдпреЛ SHA256 рд▓рд╛рдИ рд╕рдорд░реНрдерди рдирдЧрд░реНрдиреЗ рдкреНрд░рдгрд╛рд▓реАрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдорд╛рддреНрд░ рдЙрдкрдпреБрдХреНрдд рдЫ), рд╡рд╛ SHA256 рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╣реНрдпрд╛рд╕ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реЗрд░, рдЬреБрди BASE64Url рдорд╛ рдЗрдиреНрдХреЛрдб рдЧрд░рд┐рдПрдХреЛ рд╣реБрдиреБрдкрд░реНрдЫ (рднрд┐рдиреНрди Base64 рдмрд╛рдЯ рджреБрдИ рддрд╛рд▓рд┐рдХрд╛ рдХреНрдпрд╛рд░реЗрдХреНрдЯрд░рд╣рд░реВ) рд░ рдХреНрдпрд╛рд░реЗрдХреНрдЯрд░ рд▓рд╛рдЗрди рдЕрдиреНрддреНрдпрд╣рд░реВ рд╣рдЯрд╛рдЙрдБрджреИ: =ред
рдЕрд░реНрдХреЛ, рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкрдЫрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╣рд╛рдореАрд▓реЗ рд╕реНрдерд╛рдиреАрдп рдореЗрд╕рд┐рдирдорд╛ http рд╕реБрдиреНрди рд╕реБрд░реБ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рдЬреБрди рд░рд┐рдбрд┐рд░реЗрдХреНрдЯрдХреЛ рд░реВрдкрдорд╛ рдлрд░реНрдХрд╛рдЗрдиреЗрдЫред
рдкреНрд░рд╢рд╛рд╕рдирд┐рдХ рдХрд╛рд░реНрдпрд╣рд░реВ рд╡рд┐рд╢реЗрд╖ рд╕рд░реНрднрд░рдорд╛ рдЧрд░рд┐рдиреНрдЫ, рд╣рд╛рдореА рдзреЗрд░реИ рдкреНрд░рд╢рд╛рд╕рдХрд╣рд░реВрд▓реЗ рдПрдХреИ рд╕рдордпрдорд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдЙрдиреЗ рд╕рдореНрднрд╛рд╡рдирд╛рд▓рд╛рдИ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реНрди рд╕рдХреНрджреИрдиреМрдВ, рддреНрдпрд╕реИрд▓реЗ рдпрд╕рд▓реЗ рд╡рд░реНрддрдорд╛рди рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдЕрдирд┐рдпрдорд┐рдд рд░реВрдкрдорд╛ рдкреЛрд░реНрдЯ рдЪрдпрди рдЧрд░реНрдиреЗрдЫ, рддрд░ рдореИрд▓реЗ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдкреЛрд░реНрдЯрд╣рд░реВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реЗрдХреЛ рдЫреБ рдХрд┐рдирднрдиреЗ рддрд┐рдиреАрд╣рд░реВ рдкрдирд┐ API рдХрдиреНрд╕реЛрд▓рдорд╛ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдкрдорд╛ рдердкрд┐рдиреБрдкрд░реНрдЫред
рдкрд╣реБрдБрдЪ_рдкреНрд░рдХрд╛рд░ = рдЕрдлрд▓рд╛рдЗрди рдпрд╕рдХреЛ рдорддрд▓рдм рдПрдкреНрд▓рд┐рдХреЗрд╕рдирд▓реЗ рдмреНрд░рд╛рдЙрдЬрд░рд╕рдБрдЧ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдХреЛ рдЕрдиреНрддрд░реНрдХреНрд░рд┐рдпрд╛ рдмрд┐рдирд╛ рдиреИ рдореНрдпрд╛рдж рд╕рдХрд┐рдПрдХреЛ рдЯреЛрдХрди рдЕрдкрдбреЗрдЯ рдЧрд░реНрди рд╕рдХреНрдЫ,
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛_рдкреНрд░рдХрд╛рд░ = рдХреЛрдб рдХреЛрдб рдХрд╕рд░реА рдлрд░реНрдХрд╛рдЗрдиреЗрдЫ рднрдиреНрдиреЗ рдврд╛рдБрдЪрд╛ рд╕реЗрдЯ рдЧрд░реНрджрдЫ (рдкреБрд░рд╛рдиреЛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╡рд┐рдзрд┐рдХреЛ рд╕рдиреНрджрд░реНрдн, рдЬрдм рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд▓реЗ рдмреНрд░рд╛рдЙрдЬрд░рдмрд╛рдЯ рд▓рд┐рдкрд┐рдорд╛ рдХреЛрдб рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрдпреЛ),
рдЧреБрдВрдЬрд╛рдЗрд╢ рдкрд╣реБрдБрдЪрдХреЛ рджрд╛рдпрд░рд╛ рд░ рдкреНрд░рдХрд╛рд░рд▓рд╛рдИ рд╕рдВрдХреЗрдд рдЧрд░реНрджрдЫред рддрд┐рдиреАрд╣рд░реВ рдЦрд╛рд▓реА рдард╛рдЙрдБ рд╡рд╛ %20 (URL рдПрдиреНрдХреЛрдбрд┐рдЩ рдЕрдиреБрд╕рд╛рд░) рджреНрд╡рд╛рд░рд╛ рдЫреБрдЯреНрдпрд╛рдПрдХреЛ рд╣реБрдиреБрдкрд░реНрдЫред рдкреНрд░рдХрд╛рд░рдХрд╛ рд╕рд╛рде рдкрд╣реБрдБрдЪ рдХреНрд╖реЗрддреНрд░рд╣рд░реВрдХреЛ рд╕реВрдЪреА рдпрд╣рд╛рдБ рджреЗрдЦреНрди рд╕рдХрд┐рдиреНрдЫ:
рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдЧрд░реЗрдкрдЫрд┐, рдПрдкреНрд▓рд┐рдХреЗрд╕рдирд▓реЗ рдмреНрд░рд╛рдЙрдЬрд░рдорд╛ рдирдЬрд┐рдХрдХреЛ рд╕рдиреНрджреЗрд╢ рдлрд┐рд░реНрддрд╛ рдЧрд░реНрдиреЗрдЫ, рдкреЛрд░реНрдЯрдорд╛ рд╕реБрдиреНрди рд░реЛрдХреНрдиреЗрдЫ рд░ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди POST рдЕрдиреБрд░реЛрдз рдкрдард╛рдЙрдиреЗрдЫред рд╣рд╛рдореА рдпрд╕рдорд╛ рдХрдиреНрд╕реЛрд▓ 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'])
}
}
}
}
рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдзрдорд╛, рддрдкрд╛рдИрдВрд▓реЗ рдЯреЛрдХрди рдкреНрд░рдХрд╛рд░ рд░ рдкрд╣реБрдБрдЪ рдЯреЛрдХрди рдиреИ рд╕рдорд╛рд╡реЗрд╢ рднрдПрдХреЛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╣реЗрдбрд░ рдкрдард╛рдЙрдиреБ рдкрд░реНрдЫред рд╣рд╛рд▓, рдЯреЛрдХрди рдкреНрд░рдХрд╛рд░ рд╕рдзреИрдВ рдмреЗрдпрд░рд░ рд╣реЛред рдХрд┐рдирднрдиреЗ рд╣рд╛рдореАрд▓реЗ рдЯреЛрдХрдирдХреЛ рдореНрдпрд╛рдж рд╕рдХрд┐рдПрдХреЛ рдЫреИрди рднрдиреЗрд░ рдЬрд╛рдБрдЪ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рд░ рдпреЛ рдЬрд╛рд░реА рднрдПрдХреЛ рдПрдХ рдШрдгреНрдЯрд╛ рдкрдЫрд┐ рдпрд╕рд▓рд╛рдИ рдЕрдкрдбреЗрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рдореИрд▓реЗ рдЕрд░реНрдХреЛ рдкреНрд░рдХрд╛рд░реНрдпрдХреЛ рд▓рд╛рдЧрд┐ рдЕрдиреБрд░реЛрдз рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реЗрдХреЛ рдЫреБ рдЬрд╕рд▓реЗ рдкрд╣реБрдБрдЪ рдЯреЛрдХрди рдлрд┐рд░реНрддрд╛ рдЧрд░реНрдЫред рдкрд╣рд┐рд▓реЛ рдкрд╣реБрдБрдЪ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрджрд╛ рдХреЛрдбрдХреЛ рдПрдЙрдЯреИ рдЯреБрдХреНрд░рд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯрдХреЛ рд╕реБрд░реБрдорд╛ рд╣реБрдиреНрдЫ:
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
}
рдЗрдореЗрд▓:$ рдХреНрд╡реЗрд░реА рдЕрдиреБрд░реЛрдзрд▓реЗ рдПрдкреАрдЖрдИрд▓рд╛рдИ рдЙрдкрдирд╛рдо рд╕рд╣рд┐рдд рдареНрдпрд╛рдХреНрдХреИ рддреНрдпреЛ рдЗрдореЗрд▓ рднрдПрдХреЛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдЦреЛрдЬреНрди рд╕реЛрдзреНрдиреЗрдЫред рддрдкрд╛рдИрдВ рдкрдирд┐ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ: =, :, :{PREFIX}*.
рдбрд╛рдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди, GET рдЕрдиреБрд░реЛрдз рд╡рд┐рдзрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдбрд╛рдЯрд╛ рдШреБрд╕рд╛рдЙрди (рдЦрд╛рддрд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗ рд╡рд╛ рд╕рдореВрд╣рдорд╛ рд╕рджрд╕реНрдп рдердкреНрдиреЗ) - POST, рдЕрд╡рд╕реНрдерд┐рдд рдбрд╛рдЯрд╛ рдЕрдкрдбреЗрдЯ рдЧрд░реНрди - PUT, рд░реЗрдХрд░реНрдб рдореЗрдЯрд╛рдЙрди (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рд╕рдореВрд╣рдмрд╛рдЯ рд╕рджрд╕реНрдп) - рдореЗрдЯрд╛рдЙрдиред
рд╕реНрдХреНрд░рд┐рдкреНрдЯрд▓реЗ рдлреЛрди рдирдореНрдмрд░ (рдПрдХ рдЕрдкреНрд░рдорд╛рдгрд┐рдд рд╕реНрдЯреНрд░рд┐рдЩ) рд░ рдХреНрд╖реЗрддреНрд░реАрдп рд╡рд┐рддрд░рдг рд╕рдореВрд╣рдорд╛ рд╕рдорд╛рд╡реЗрд╢рдХреЛ рд▓рд╛рдЧрд┐ рдкрдирд┐ рд╕реЛрдзреНрдиреЗрдЫред рдпрд╕рд▓реЗ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд▓рд╛рдИ рдЪрдпрди рдЧрд░рд┐рдПрдХреЛ рд╕рдХреНрд░рд┐рдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ OU рдХреЛ рдЖрдзрд╛рд░рдорд╛ рдХреБрди рд╕рдВрдЧрдардирд╛рддреНрдордХ рдПрдХрд╛рдЗ рд╣реБрдиреБрдкрд░реНрдЫ рднрдиреЗрд░ рдирд┐рд░реНрдгрдп рдЧрд░реНрдЫ рд░ рдкрд╛рд╕рд╡рд░реНрдбрдХреЛ рд╕рд╛рде рдЖрдЙрдБрдЫ:
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
}
рдЦрд╛рддрд╛ рдЕрдкрдбреЗрдЯ рдЧрд░реНрдиреЗ рд░ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗ рдХрд╛рд░реНрдпрд╣рд░реВрдорд╛ рд╕рдорд╛рди рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╣реБрдиреНрдЫ; рд╕рдмреИ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрд╖реЗрддреНрд░рд╣рд░реВ рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрджреИрди; рдлреЛрди рдирдореНрдмрд░рд╣рд░реВ рднрдПрдХреЛ рдЦрдгреНрдбрдорд╛, рддрдкрд╛рдИрдВрд▓реЗ рд╕рдВрдЦреНрдпрд╛ рд░ рдпрд╕рдХреЛ рдкреНрд░рдХрд╛рд░рдХреЛ рд╕рд╛рде рдПрдХ рд░реЗрдХрд░реНрдб рд╕рдореНрдо рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрди рд╕рдХреНрдиреЗ рдПрд░реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред
рд╕рдореВрд╣рдорд╛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдердкреНрджрд╛ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдирдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореА рдкрд╣рд┐рд▓реЗ рдиреИ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдмрд╛рдЯ рд╕рдореВрд╣ рд╕рджрд╕реНрдп рд╡рд╛ рд╕рдВрд░рдЪрдирд╛рдХреЛ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдЧрд░реЗрд░ рдпреЛ рд╕рдореВрд╣рдХреЛ рд╕рджрд╕реНрдп рдЫ рдХрд┐ рдЫреИрди рднрдиреЗрд░ рдЬрд╛рдБрдЪ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВред
рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдХреЛ рд╕рдореВрд╣ рд╕рджрд╕реНрдпрддрд╛ рдХреНрд╡реЗрд░реА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╣реБрдиреЗрдЫреИрди рд░ рдкреНрд░рддреНрдпрдХреНрд╖ рд╕рджрд╕реНрдпрддрд╛ рдорд╛рддреНрд░ рджреЗрдЦрд╛рдЙрдиреЗрдЫред рдПрдХ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд▓рд╛рдИ рдЕрднрд┐рднрд╛рд╡рдХ рд╕рдореВрд╣рдорд╛ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрд╛ рдкрд╣рд┐рд▓реЗ рдиреИ рдПрдЙрдЯрд╛ рдмрд╛рд▓ рд╕рдореВрд╣ рдЫ рдЬрд╕рдХреЛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд╕рджрд╕реНрдп рдЫред
рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛
рд╕рдмреИ рдмрд╛рдБрдХреА рдЫ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд▓рд╛рдИ рдирдпрд╛рдБ рдЦрд╛рддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдкрд╛рд╕рд╡рд░реНрдб рдкрдард╛рдЙрдиред рд╣рд╛рдореА рдпреЛ рдПрд╕рдПрдордПрд╕ рдорд╛рд░реНрдлрдд рдЧрд░реНрдЫреМрдВ, рд░ рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВ рд╕рд╣рд┐рдд рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рдкрдард╛рдЙрдБрдЫреМрдВ рд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЗрдореЗрд▓рдорд╛ рд▓рдЧрдЗрди рдЧрд░реНрдЫреМрдВ, рдЬреБрди, рдлреЛрди рдирдореНрдмрд░ рд╕рд╣рд┐рдд, рднрд░реНрддреА рд╡рд┐рднрд╛рдЧрд▓реЗ рдкреНрд░рджрд╛рди рдЧрд░реЗрдХреЛ рдерд┐рдпреЛред рдПрдХ рд╡рд┐рдХрд▓реНрдкрдХреЛ рд░реВрдкрдорд╛, рддрдкрд╛рдЗрдБ рдкреИрд╕рд╛ рдмрдЪрдд рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рд░ рддрдкрд╛рдЗрдБрдХреЛ рдкрд╛рд╕рд╡рд░реНрдб рдЧреЛрдкреНрдп рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдо рдЪреНрдпрд╛рдЯрдорд╛ рдкрдард╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдЬреБрди рджреЛрд╕реНрд░реЛ рдХрд╛рд░рдХ рдкрдирд┐ рдорд╛рдиреНрди рд╕рдХрд┐рдиреНрдЫ (рдореНрдпрд╛рдХрдмреБрдХ рдПрдХ рдЕрдкрд╡рд╛рдж рд╣реБрдиреЗрдЫ)ред
рдЕрдиреНрддреНрдп рд╕рдореНрдо рдкрдвреНрдиреБ рднрдПрдХреЛрдорд╛ рдзрдиреНрдпрд╡рд╛рджред рдо рд▓реЗрдЦ рд▓реЗрдЦреНрдиреЗ рд╢реИрд▓реА рд╕реБрдзрд╛рд░ рдЧрд░реНрди рд╕реБрдЭрд╛рд╡рд╣рд░реВ рд╣реЗрд░реНрди рдкрд╛рдЙрдБрджрд╛ рдЦреБрд╕реА рд╣реБрдиреЗрдЫреБ рд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд╣рд░реВ рд▓реЗрдЦреНрджрд╛ рдХрдо рддреНрд░реБрдЯрд┐рд╣рд░реВ рд╕рдорд╛рддреНрди рдЪрд╛рд╣рдиреНрдЫреБ =)
рд▓рд┐рдЩреНрдХрд╣рд░реВрдХреЛ рд╕реВрдЪреА рдЬреБрди рд╡рд┐рд╖рдпрдЧрдд рд░реВрдкрдорд╛ рдЙрдкрдпреЛрдЧреА рд╣реБрди рд╕рдХреНрдЫ рд╡рд╛ рдкреНрд░рд╢реНрдирд╣рд░реВрдХреЛ рдЬрд╡рд╛рдл рдорд╛рддреНрд░:
рдореЛрдмрд╛рдЗрд▓ рд░ рдбреЗрд╕реНрдХрдЯрдк рдПрдкрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ OAuth 2.0 рд╡реЗрдм рд╕рд░реНрднрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ OAuth 2.0 рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ OAuth рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЧреНрд░рд╛рд╣рдХрд╣рд░реБ рджреНрд╡рд╛рд░рд╛ рдХреЛрдб рдПрдХреНрд╕рдЪреЗрдиреНрдЬ рдХреЛ рд▓рд╛рдЧреА рдкреНрд░рдорд╛рдг рдХреБрдЮреНрдЬреА PowerShell рдорд╛рд░реНрдлрдд рдЕрдирд┐рдпрдорд┐рдд рдЕрдХреНрд╖рд░рд╣рд░реВ рдЙрддреНрдкрдиреНрди рдЧрд░реНрдиреБрд╣реЛрд╕реН ASCII рддрд╛рд▓рд┐рдХрд╛ рд░ рд╡рд┐рд╡рд░рдг PowerShell: рд╕реНрдЯреНрд░рд┐рдЩрдХреЛ рд▓рд╛рдЧрд┐ рд╣реНрдпрд╛рд╕ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрджреИ рдЗрдиреНрдХреЛрдб/рдбрд┐рдХреЛрдб Base64Url Base64 рдПрдиреНрдХреЛрдбрд┐рдЩ рдмрдирд╛рдо Base64url рдЗрдиреНрдХреЛрдбрд┐рдЩ PowerShell 5.1 рдорд╛ Invoke-RestMethod рдЪрд░рдг 1 рдорд╛ access_type рдЕрдлрд▓рд╛рдЗрди рднрдП рдкрдирд┐ рддрд╛рдЬрд╛ рдЯреЛрдХрди рдкрд╛рдЙрдБрджреИ рдЫреИрди рддреБрд▓рдирд╛ рдЕрдкрд░реЗрдЯрд░рд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ API: рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдЦрд╛рддрд╛рд╣рд░реВ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВ рдЦреЛрдЬреНрдиреБрд╣реЛрд╕реН рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ API: рд╕рдореВрд╣рд╣рд░реВ Invoke-RestMethod - Powershell рдХреЛ рд▓рд╛рдЧрд┐ рддреНрд░реБрдЯрд┐ рд╣реНрдпрд╛рдиреНрдбрд▓рд┐рдВрдЧ
рд╕реНрд░реЛрдд: www.habr.com