рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд╡рд░рд╢реЗрд▓ рд╕реЗ Google рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдирд╛

рд╣рд╛рдп!

рдпрд╣ рдЖрд▓реЗрдЦ G Suite рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Google API рдХреЗ рд╕рд╛рде PowerShell рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдЧрд╛ред

рд╣рдо рдкреВрд░реЗ рд╕рдВрдЧрдарди рдореЗрдВ рдХрдИ рдЖрдВрддрд░рд┐рдХ рдФрд░ рдХреНрд▓рд╛рдЙрдб рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП, рдЙрдирдореЗрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг Google рдпрд╛ рд╕рдХреНрд░рд┐рдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдкрд╛рд╕ рдЖрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмреАрдЪ рд╣рдо рдПрдХ рдкреНрд░рддрд┐рдХреГрддрд┐ рдмрдирд╛рдП рдирд╣реАрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ; рддрджрдиреБрд╕рд╛рд░, рдЬрдм рдХреЛрдИ рдирдпрд╛ рдХрд░реНрдордЪрд╛рд░реА рдирд┐рдХрд▓рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрди рджреЛрдиреЛрдВ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рдЦрд╛рддрд╛ рдмрдирд╛рдиреЗ/рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЬреЛ рдЬрд╛рдирдХрд╛рд░реА рдПрдХрддреНрд░ рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рджреЛрдиреЛрдВ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рднреЗрдЬрддреА рд╣реИред

рдкреНрд░рд╛рдзрд┐рдХрд░рдг

рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╕рдордп, рд╣рдордиреЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдирд╡ рдкреНрд░рд╢рд╛рд╕рдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛; рдпрд╣ рдЖрдХрд╕реНрдорд┐рдХ рдпрд╛ рдЬрд╛рдирдмреВрдЭрдХрд░ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИред

Google API рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдФрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП OAuth 2.0 рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдВ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ: Google API рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП OAuth 2.0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛.

рдореИрдВрдиреЗ рд╡рд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪреБрдиреА рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдбреЗрд╕реНрдХрдЯреЙрдк рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реЗрд╡рд╛ рдЦрд╛рддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рднреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рдиреАрдЪреЗ рджреА рдЧрдИ рддрд╕реНрд╡реАрд░ Google рдкреГрд╖реНрда рд╕реЗ рдЪрдпрдирд┐рдд рдкрд░рд┐рджреГрд╢реНрдп рдХрд╛ рдПрдХ рдпреЛрдЬрдирд╛рдмрджреНрдз рд╡рд┐рд╡рд░рдг рд╣реИред

рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд╡рд░рд╢реЗрд▓ рд╕реЗ Google рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдирд╛

  1. рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо GET рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реБрдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ Google рдЦрд╛рддрд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреГрд╖реНрда рдкрд░ рднреЗрдЬрддреЗ рд╣реИрдВ:
    • рдЖрд╡реЗрджрди рдкрд╣рдЪрд╛рди рдкрддреНрд░
    • рд╡реЗ рдХреНрд╖реЗрддреНрд░ рдЬрд╣рд╛рдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
    • рд╡рд╣ рдкрддрд╛ рдЬрд┐рд╕ рдкрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреВрд░реА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреБрдирдГ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
    • рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рдо рдЯреЛрдХрди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВрдЧреЗ
    • рд╕реБрд░рдХреНрд╖рд╛ рдХреЛрдб
    • рд╕рддреНрдпрд╛рдкрди рдХреЛрдб рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдкреНрд░рд╛рд░реВрдк

  2. рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ GET рдорд╛рдкрджрдВрдбреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдПрдХ рддреНрд░реБрдЯрд┐ рдпрд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЛрдб рдХреЗ рд╕рд╛рде, рдкрд╣рд▓реЗ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреГрд╖реНрда рдкрд░ рдкреБрдирдГ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
  3. рдПрдкреНрд▓рд┐рдХреЗрд╢рди (рд╕реНрдХреНрд░рд┐рдкреНрдЯ) рдХреЛ рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░, рдпрджрд┐ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рд╣реИ, рддреЛ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ
  4. рдпрджрд┐ рдЕрдиреБрд░реЛрдз рд╕рд╣реА рд╣реИ, рддреЛ Google API рд▓реМрдЯрд╛рддрд╛ рд╣реИ:
    • рдПрдХреНрд╕реЗрд╕ рдЯреЛрдХрди рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
    • рдЗрд╕ рдЯреЛрдХрди рдХреА рд╡реИрдзрддрд╛ рдЕрд╡рдзрд┐
    • рдПрдХреНрд╕реЗрд╕ рдЯреЛрдХрди рдХреЛ рд░реАрдлреНрд░реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реАрдлреНрд░реЗрд╢ рдЯреЛрдХрди рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ Google API рдХрдВрд╕реЛрд▓ рдкрд░ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛: рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ - Google API рдХрдВрд╕реЛрд▓, рд╡рд╛рдВрдЫрд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдФрд░ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдПрдХ рдХреНрд▓рд╛рдЗрдВрдЯ OAuth рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдмрдирд╛рдПрдВред рд╡рд╣рд╛рдВ (рдпрд╛ рдмрд╛рдж рдореЗрдВ, рдмрдирд╛рдП рдЧрдП рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рдЧреБрдгреЛрдВ рдореЗрдВ) рдЖрдкрдХреЛ рдЙрди рдкрддреЗ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рди рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпреЗ рд╡рд┐рднрд┐рдиреНрди рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде рдХрдИ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рд╣реЛрдВрдЧреА (рдиреАрдЪреЗ рджреЗрдЦреЗрдВ)ред

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдкрдврд╝рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдкрд╣рд▓реЗ рдЪрд░рдгреЛрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕реЗрд╕ рдФрд░ рд░реАрдлреНрд░реЗрд╢ рдЯреЛрдХрди рд▓реМрдЯрд╛рдПрдЧрд╛:

$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 рд╕реБрдирдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдкреНрд░рд╢рд╛рд╕рдирд┐рдХ рдХрд╛рд░реНрдп рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рд░реНрд╡рд░ рдкрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд╣рдо рдЗрд╕ рд╕рдВрднрд╛рд╡рдирд╛ рд╕реЗ рдЗрдВрдХрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрдИ рдкреНрд░рд╢рд╛рд╕рдХ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдПрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдкреЛрд░реНрдЯ рдХрд╛ рдЪрдпрди рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдкреЛрд░реНрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдПрдкреАрдЖрдИ рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

access_type=рдСрдлрд╝рд▓рд╛рдЗрди рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХреЗ рдмрд┐рдирд╛ рдЕрдкрдиреЗ рдЖрдк рд╕рдорд╛рдкреНрдд рд╣реЛ рдЪреБрдХреЗ рдЯреЛрдХрди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ,
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛_рдкреНрд░рдХрд╛рд░ = рдХреЛрдб рдХреЛрдб рдХреИрд╕реЗ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЗрд╕рдХрд╛ рдкреНрд░рд╛рд░реВрдк рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдкреБрд░рд╛рдиреА рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкрджреНрдзрддрд┐ рдХрд╛ рд╕рдВрджрд░реНрдн, рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рдХреЛрдб рдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдерд╛),
рдХреНрд╖реЗрддреНрд░ рдкрд╣реБрдВрдЪ рдХреЗ рджрд╛рдпрд░реЗ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдпрд╛ %20 (рдпреВрдЖрд░рдПрд▓ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рдЕрдиреБрд╕рд╛рд░) рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреНрд░рдХрд╛рд░реЛрдВ рд╕рд╣рд┐рдд рдкрд╣реБрдВрдЪ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рд╕реВрдЪреА рдпрд╣рд╛рдВ рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИ: Google API рдХреЗ рд▓рд┐рдП OAuth 2.0 рд╕реНрдХреЛрдк.

рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдПрдХ рдмрдВрдж рд╕рдВрджреЗрд╢ рд▓реМрдЯрд╛рдПрдЧрд╛, рдкреЛрд░реНрдЯ рдкрд░ рд╕реБрдирдирд╛ рдмрдВрдж рдХрд░ рджреЗрдЧрд╛ рдФрд░ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ POST рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдЧрд╛ред рд╣рдо рдЗрд╕рдореЗрдВ рдХрдВрд╕реЛрд▓ рдПрдкреАрдЖрдИ рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЖрдИрдбреА рдФрд░ рд░рд╣рд╕реНрдп, рд╡рд╣ рдкрддрд╛ рдЬрд┐рд╕ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдиреБрджрд╛рди_рдкреНрд░рдХрд╛рд░ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдЬрд╡рд╛рдм рдореЗрдВ, рд╣рдореЗрдВ рдПрдХ рдПрдХреНрд╕реЗрд╕ рдЯреЛрдХрди, рд╕реЗрдХрдВрдб рдореЗрдВ рдЗрд╕рдХреА рд╡реИрдзрддрд╛ рдЕрд╡рдзрд┐ рдФрд░ рдПрдХ рд░рд┐рдлреНрд░реЗрд╢ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдПрдХреНрд╕реЗрд╕ рдЯреЛрдХрди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓рдВрдмреА рд╢реЗрд▓реНрдл рд▓рд╛рдЗрдл рдХреЗ рд╕рд╛рде рдЯреЛрдХрди рдХреЛ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╕реНрдерд╛рди рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЬрдм рддрдХ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдкрд╣реБрдВрдЪ рдХреЛ рд░рджреНрдж рдирд╣реАрдВ рдХрд░рддреЗ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддрд╛рдЬрд╝рд╛ рдЯреЛрдХрди рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЕрдВрдд рдореЗрдВ, рдореИрдВрдиреЗ рдЯреЛрдХрди рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдЬреЛрдбрд╝рд╛; рдпрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ рдФрд░ рддрд╛рдЬрд╝рд╛ рдЯреЛрдХрди рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛, рддреЛ рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧреА (рд╣рдордиреЗ рдЯрд░реНрдорд┐рдирд▓ рдкрд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЯреЛрдХрди рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдорд╛рдирд╛, рдФрд░ рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ) 'рдореИрдВ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдХреЗ рд╕рд╛рде рдЪреАрдЬреЛрдВ рдХреЛ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдпрд╛ рдмрд╛рд░-рдмрд╛рд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЦреЛрд▓рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛)ред

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
}

рдИрдореЗрд▓:$рдХреНрд╡реЗрд░реА рдЕрдиреБрд░реЛрдз рдПрдкреАрдЖрдИ рдХреЛ рдЙрдкрдирд╛рдо рд╕рд╣рд┐рдд рдмрд┐рд▓реНрдХреБрд▓ рдЙрд╕реА рдИрдореЗрд▓ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдЧрд╛ред рдЖрдк рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: =, :, :{рдЙрдкрд╕рд░реНрдЧ}*.

рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, GET рдЕрдиреБрд░реЛрдз рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдбреЗрдЯрд╛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдЦрд╛рддрд╛ рдмрдирд╛рдирд╛ рдпрд╛ рдХрд┐рд╕реА рд╕рдореВрд╣ рдореЗрдВ рд╕рджрд╕реНрдп рдЬреЛрдбрд╝рдирд╛) - POST, рдореМрдЬреВрджрд╛ рдбреЗрдЯрд╛ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - PUT, рдХрд┐рд╕реА рд░рд┐рдХреЙрд░реНрдб рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рд╕рдореВрд╣ рд╕реЗ рдХреЛрдИ рд╕рджрд╕реНрдп) - рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдорд┐рдЯрд╛рдирд╛ред

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рдлрд╝реЛрди рдирдВрдмрд░ (рдПрдХ рдЕрдорд╛рдиреНрдп рд╕реНрдЯреНрд░рд┐рдВрдЧ) рдФрд░ рдХреНрд╖реЗрддреНрд░реАрдп рд╡рд┐рддрд░рдг рд╕рдореВрд╣ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдкреВрдЫреЗрдЧреАред рдпрд╣ рдЪрдпрдирд┐рдд рд╕рдХреНрд░рд┐рдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдУрдпреВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдХреМрди рд╕реА рд╕рдВрдЧрдардирд╛рддреНрдордХ рдЗрдХрд╛рдИ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ:

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
}

рдЦрд╛рддрд╛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдФрд░ рдмрдирд╛рдиреЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реЛрддрд╛ рд╣реИ; рд╕рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝реАрд▓реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ; рдлрд╝реЛрди рдирдВрдмрд░ рд╡рд╛рд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ, рдЖрдкрдХреЛ рдПрдХ рд╕рд░рдгреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЙрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рд░рд┐рдХреЙрд░реНрдб рддрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдХрд┐рд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рдореВрд╣ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдХреЛрдИ рддреНрд░реБрдЯрд┐ рди рд╣реЛ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рд╕рдореВрд╣ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдпрд╛ рд░рдЪрдирд╛ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдХреЗ рдпрд╣ рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рд╕рдореВрд╣ рдХрд╛ рд╕рджрд╕реНрдп рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕рдореВрд╣ рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫрддрд╛рдЫ рдХрд░рдирд╛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рдХреЗрд╡рд▓ рдкреНрд░рддреНрдпрдХреНрд╖ рд╕рджрд╕реНрдпрддрд╛ рджрд┐рдЦрд╛рдПрдЧрд╛ред рдХрд┐рд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдРрд╕реЗ рдореВрд▓ рд╕рдореВрд╣ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЪрд╛рдЗрд▓реНрдб рд╕рдореВрд╣ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рджрд╕реНрдп рд╣реИ, рд╕рдлрд▓ рд╣реЛрдЧрд╛ред

рдирд┐рд╖реНрдХрд░реНрд╖

рдЬреЛ рдХреБрдЫ рдмрдЪрд╛ рд╣реИ рд╡рд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдирдП рдЦрд╛рддреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕рд╡рд░реНрдб рднреЗрдЬрдирд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ рдПрд╕рдПрдордПрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рднреЗрдЬрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдИрдореЗрд▓ рдкрд░ рд▓реЙрдЧрд┐рди рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдлреЛрди рдирдВрдмрд░ рдХреЗ рд╕рд╛рде, рднрд░реНрддреА рд╡рд┐рднрд╛рдЧ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдк рдкреИрд╕реЗ рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдирд╛ рдкрд╛рд╕рд╡рд░реНрдб рдЧреБрдкреНрдд рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдЪреИрдЯ рдкрд░ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рджреВрд╕рд░рд╛ рдХрд╛рд░рдХ рднреА рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдореИрдХрдмреБрдХ рдПрдХ рдЕрдкрд╡рд╛рдж рд╣реЛрдЧрд╛)ред

рдЕрдВрдд рддрдХ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж. рдореБрдЭреЗ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХреА рд╢реИрд▓реА рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕реБрдЭрд╛рд╡ рджреЗрдЦрдХрд░ рдЦреБрд╢реА рд╣реЛрдЧреА рдФрд░ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрддреЗ рд╕рдордп рдЖрдкрдХреЛ рдХрдо рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкрдХрдбрд╝реЗрдВ =)

рдЙрди рд▓рд┐рдВрдХреЛрдВ рдХреА рд╕реВрдЪреА рдЬреЛ рд╡рд┐рд╖рдпрдЧрдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдХреЗрд╡рд▓ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЙрддреНрддрд░ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ:

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ