เชนเซเชฒเซ!
เช เชฒเซเช G Suite เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเชเชจเซ เชเชพเชฒเชพเชเซ เชเชฐเชตเชพ เชฎเชพเชเซ Google API เชธเชพเชฅเซ เชชเชพเชตเชฐเชถเซเชฒ เชเซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเชเซเชฐเชฟเชฏเชพเชจเชพ เช เชฎเชฒเซเชเชฐเชฃเชจเซเช เชตเชฐเซเชฃเชจ เชเชฐเชถเซ.
เช
เชฎเซ เชธเชฎเชเซเชฐ เชธเชเชธเซเชฅเชพเชฎเชพเช เช
เชจเซเช เชเชเชคเชฐเชฟเช เช
เชจเซ เชเซเชฒเชพเชเชก เชธเซเชตเชพเชเชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช. เชฎเซเชเซเชญเชพเชเซ, เชคเซเชฎเชพเช เช
เชงเชฟเชเซเชคเชคเชพ Google เช
เชฅเชตเชพ เชเชเซเชเชฟเชต เชกเชฟเชฐเซเชเซเชเชฐเซเชฎเชพเช เชเชตเซ เชเซ, เชเซเชจเซ เชตเชเซเชเซ เช
เชฎเซ เชชเซเชฐเชคเชฟเชเซเชคเชฟ เชเชพเชณเชตเซ เชถเชเชคเชพ เชจเชฅเซ; เชคเซ เชฎเซเชเชฌ, เชเซเชฏเชพเชฐเซ เชเซเช เชจเชตเซ เชเชฐเซเชฎเชเชพเชฐเซ เชเชพเชฏ เชเซ, เชคเซเชฏเชพเชฐเซ เชคเชฎเชพเชฐเซ เช เชฌเซ เชธเชฟเชธเซเชเชฎเชฎเชพเช เชเชเชพเชเชจเซเช เชฌเชจเชพเชตเชตเชพ/เชธเชเซเชฐเชฟเชฏ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ. เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซ เชธเซเชตเชเชพเชฒเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเซ, เช
เชฎเซ เชเช เชธเซเชเซเชฐเชฟเชชเซเช เชฒเชเชตเชพเชจเซเช เชจเชเซเชเซ เชเชฐเซเชฏเซเช เชเซ เชเซ เชฎเชพเชนเชฟเชคเซ เชเชเชคเซเชฐเชฟเชค เชเชฐเซ เชเซ เช
เชจเซ เชคเซเชจเซ เชฌเชเชจเซ เชธเซเชตเชพเชเชจเซ เชฎเซเชเชฒเซ เชเซ.
เช เชงเชฟเชเซเชคเชคเชพ
เชเชตเชถเซเชฏเชเชคเชพเชเชจเซ เชฆเซเชฐเชคเซ เชตเชเชคเซ, เช เชฎเซ เช เชงเชฟเชเซเชคเชคเชพ เชฎเชพเชเซ เชตเชพเชธเซเชคเชตเชฟเช เชฎเชพเชจเชต เชชเซเชฐเชฌเชเชงเชเซเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซเช เชจเชเซเชเซ เชเชฐเซเชฏเซเช; เช เชเชเชธเซเชฎเชฟเช เช เชฅเชตเชพ เชเชฐเชพเชฆเชพเชชเซเชฐเซเชตเช เชฎเซเชเชพ เชซเซเชฐเชซเชพเชฐเซเชจเซ เชเชเชจเชพเชฎเชพเช เชเซเชฐเชฟเชฏเชพเชเชจเชพ เชตเชฟเชถเซเชฒเซเชทเชฃเชจเซ เชธเชฐเชณ เชฌเชจเชพเชตเซ เชเซ.
Google API เชชเซเชฐเชฎเชพเชฃเซเชเชฐเชฃ เช
เชจเซ เช
เชงเชฟเชเซเชคเชคเชพ เชฎเชพเชเซ OAuth 2.0 เชชเซเชฐเซเชเซเชเซเชฒเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ. เชเชชเชฏเซเชเชจเชพ เชเซเชธ เช
เชจเซ เชตเชงเซ เชตเชฟเชเชคเชตเชพเชฐ เชตเชฐเซเชฃเชจ เช
เชนเซเช เชฎเชณเซ เชถเชเซ เชเซ:
เชฎเซเช เชธเซเชเซเชฐเชฟเชชเซเช เชชเชธเชเชฆ เชเชฐเซ เชเซ เชเซเชจเซ เชเชชเชฏเซเช เชกเซเชธเซเชเชเซเชช เชเชชเซเชฒเชฟเชเซเชถเชจเซเชธเชฎเชพเช เช เชงเชฟเชเซเชคเชคเชพ เชฎเชพเชเซ เชฅเชพเชฏ เชเซ. เชธเซเชตเชพ เชเชพเชคเชพเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซ เชตเชฟเชเชฒเซเชช เชชเชฃ เชเซ, เชเซเชฎเชพเช เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเชจเซ เชฌเชฟเชจเชเชฐเซเชฐเซ เชนเชฟเชฒเชเชพเชฒเชจเซ เชเชฐเซเชฐ เชจเชฅเซ.
เชจเซเชเซเชจเซเช เชเชฟเชคเซเชฐ Google เชชเซเชทเซเช เชชเชฐเชฅเซ เชชเชธเชเชฆ เชเชฐเซเชฒ เชฆเซเชถเซเชฏเชจเซเช เชฏเซเชเชจเชพเชเซเชฏ เชตเชฐเซเชฃเชจ เชเซ.
- เชชเซเชฐเชฅเชฎ, เช
เชฎเซ GET เชชเชฐเชฟเชฎเชพเชฃเซเชจเซ เชเชฒเซเชฒเซเช เชเชฐเซเชจเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเชจเซ Google เชเชเชพเชเชจเซเช เชชเซเชฐเชฎเชพเชฃเซเชเชฐเชฃ เชชเซเชทเซเช เชชเชฐ เชฎเซเชเชฒเซเช เชเซเช:
- เชเชชเซเชฒเชฟเชเซเชถเชจ เชเชเชกเซ
- เชเชชเซเชฒเซเชเซเชถเชจเชจเซ เชเชเซเชธเซเชธเชจเซ เชเชฐเซเชฐ เชนเซเชฏ เชคเซเชตเชพ เชตเชฟเชธเซเชคเชพเชฐเซ
- เชธเชฐเชจเชพเชฎเซเช เชเซ เชเซเชจเชพ เชชเชฐ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชชเซเชฐเซเชฃ เชเชฐเซเชฏเชพ เชชเชเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเชจเซ เชฐเซเชกเชพเชฏเชฐเซเชเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ
- เชเซ เชฐเซเชคเซ เชเชชเชฃเซ เชเซเชเชจ เช เชชเชกเซเช เชเชฐเซเชถเซเช
- เชธเซเชฐเชเซเชทเชพ เชเซเชก
- เชเชเชพเชธเชฃเซ เชเซเชก เชเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจ เชซเซเชฐเซเชฎเซเช
- เช เชงเชฟเชเซเชคเชคเชพ เชชเซเชฐเซเชฃ เชฅเชฏเชพ เชชเชเซ, เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเชจเซ 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 เชฎเชพเช เชเชจเซเชเซเชก เชฅเชฏเซเชฒ เชนเซเชตเซเช เชเชตเชถเซเชฏเช เชเซ (เช
เชฒเช เชฌเซเช 64 เชฅเซ เชฌเซ เชเซเชฌเชฒ เช
เชเซเชทเชฐเซ เชฆเซเชตเชพเชฐเชพ) เช
เชจเซ เช
เชเซเชทเชฐ เชฐเซเชเชพเชจเชพ เช
เชเชคเชจเซ เชฆเซเชฐ เชเชฐเซ เชฐเชนเซเชฏเชพ เชเซเช: =.
เชเชเชณ, เช เชงเชฟเชเซเชคเชคเชพ เชชเชเซ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชชเซเชฐเชพเชชเซเชค เชเชฐเชตเชพ เชฎเชพเชเซ เช เชฎเชพเชฐเซ เชธเซเชฅเชพเชจเชฟเช เชฎเชถเซเชจ เชชเชฐ 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 เชเซเชทเซเชเช เช เชจเซ เชตเชฐเซเชฃเชจ เชชเชพเชตเชฐเชถเซเชฒ: เชธเซเชเซเชฐเชฟเชเช เชฎเชพเชเซ เชนเซเชถ เชฎเซเชฒเซเชฏ เชฎเซเชณเชตเชตเซเช เชเชจเซเชเซเชก/เชกเซเชเซเชก Base64Url Base64 เชเชจเซเชเซเชกเชฟเชเช เชตเชฟ Base64url เชเชจเซเชเซเชกเชฟเชเช PowerShell 5.1 เชฎเชพเช Invoke-RestMethod เชชเชเชฒเซเช 1 เชฎเชพเช เชเชเซเชธเซเชธ_เชเชพเชเชช เชเชซเชฒเชพเชเชจ เชนเซเชตเชพ เชเชคเชพเช เชคเชพเชเซเช เชเซเชเชจ เชฎเชณเชคเซเช เชจเชฅเซ เชธเชฐเชเชพเชฎเชฃเซ เชเชชเชฐเซเชเชฐเซ เชตเชฟเชถเซ เชกเชฟเชฐเซเชเซเชเชฐเซ API: เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชเชเชพเชเชจเซเชเซเชธ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเช เชฎเชพเชเซ เชถเซเชงเซ เชกเชฟเชฐเซเชเซเชเชฐเซ API: เชเซเชฅเซ Invoke-RestMethod - Powershell เชฎเชพเชเซ เชเชฐเชฐ เชนเซเชจเซเชกเชฒเชฟเชเช
เชธเซเชฐเซเชธ: www.habr.com