Skip to main content

Používání REST API s AdminSDK

Google API nám pomocí API umožňuje spravovat celou škálu úkonů ve Workspace.

1. Vytvoření projektu na Google Cloud platformě

  1. Vytvořit si účet s oprávněními které účet potřebuje (Directory Admin, SuperUser ...). Tento účet se bude autentizovat a autorizovat proti Google.
  2. Potřebujeme si vytvořit projekt pod kterým budeme s Google Workspace manipulovat. Otevřít konzoli pro správu a kromě organizace (např.: cvut.it) bychom zde neměli nic mít (pokud jsme zde poprvé). Zde si vytvoříme projekt pomocí NEW PROJECT tlačítka, třeba TEST-PROJEKT. Vybereme si projekt a jdeme si vytvořit přístupové údaje (CTRL+O / Open project picker).
  3. Otevřít si menu [.] => APIs & Services
    • Enabled APIs & Services:
      • Admin SDK API
    • Credentials:
      • API Keys:
        • None / IP addresses (kde si zvolím svou veřejnou adresu/rozsah)
        • API restrictions:
          • Restrict key:
            • Admin SDK API
      • OAuth 2.0 Client IDs
    • OAuth consent screen:
      • Audience:
        • Internal
    • Data Access:
      • .../auth/userinfo.email
      • .../auth/userinfo.profile
      • openid
      • .../auth/admin.directory.user.security
      • .../auth/admin.directory.user
  4. Po zkopírování Client ID, Client secret a API key můžeme pokračovat s klientskou aplikací.

2. Používání API

⚠️ Tento příklad je stavěn na Windows PowerShell. Přepsání na běžný bash je jednoduché, stačí jinak definovat proměnné, cykly a místo curl.exe použít pouze curl.

  1. Definovat si ty tři proměnné co potřebujeme

    $Client_ID = "594102521534-24sq71bb9mtkjqubrgc548gfwwjipmam.apps.googleusercontent.com"
    $Client_Sekret = "GOMZFK-FbJFnlIc4O_5g8XWb4Tw3Xv5B1Zp"
    $PAPI_KEY = "AIzaSyCmdYATXDAbsaasd0CSadrsm3sb"
    
  2. Poskládat si adresu pro Webové ověření (k tomu potřebujeme Client Id) a otevřít v prohlížeči:

    🗒️ Používáme zde scope pro správu uživatelů https://www.googleapis.com/auth/admin.directory.user + openid + profile

    Např.:

    https://accounts.google.com/o/oauth2/v2/auth?scope=openid%20profile%20https://www.googleapis.com/auth/admin.directory.user&access_type=offline&include_granted_scopes=true&response_type=code&state=state_parameter_passthrough_value&redirect_uri=https%3A//localhost/code&client_id=594102521534-24sq71bb9mtkjqubrgc548gfwwjipmam.apps.googleusercontent.com
    
  3. V prohlížeči se přihlásit a potvrdit potřebná oprávnění.

  4. Po oveření bude stránka přesměrována na localhost, zde si vykopírujeme autentikační kód za klíčem code= který platí JEN JEDNOU

    🗒️ Z kompletní adresy např.: https://localhost/code?state=state_parameter_passthrough_value&code=4/0AUJH-x72nOaW68JD2gxcv11Evn5-uPAaI6j5o_nM755liciwr_... si vypreparuji 4/0AUJH-x72nOaW68JD2gxcv11Evn5-uPAaI6j5o_nM755liciwr_...

  5. Nastavím si autentikační kód do proměnné:

    $AUTH_CODE = '4/0AUJH-x72nOaW68JD2gxcv11Evn5-uPAaI6j5o_nM755liciwr_...'
    
  6. Nyní je potřeba se autorizovat, jdeme tedy získat token:

    $TOKEN = $(curl.exe -X POST `
    -d client_id=${Client_ID} `
    -d client_secret=${Client_Sekret} `
    -d grant_type=authorization_code `
    -d redirect_uri=https%3A//localhost/code `
    -d code=${AUTH_CODE} `
    https://accounts.google.com/o/oauth2/token `
    | ConvertFrom-JSON)
    
  7. Uložit si přístupový token, id token a token pro obnovu do proměnných:

    $ACCESS_TOKEN = ${TOKEN}.access_token
    $ID_TOKEN = $TOKEN.id_token
    $REFRESH_TOKEN = $TOKEN.refresh_token
    
    Write-Host "ACCESS_TOKEN: $ACCESS_TOKEN" -ForegroundColor Yellow
    Write-Host "ID_TOKEN: $ID_TOKEN" -ForegroundColor Yellow
    Write-Host "REFRESH_TOKEN: $REFRESH_TOKEN" -ForegroundColor Yellow
    
  8. Nyní můžeme používat Google API! Nezapomenou obnovovat token:

    curl.exe `
    --request POST `
    --data "client_id=$Client_ID&client_secret=$Client_Sekret&refresh_token=$REFRESH_TOKEN&grant_type=refresh_token" `
    https://accounts.google.com/o/oauth2/token
    

Vylistování všech uživatelů

  • Odstraním si .csv do kterého uživatele zapisuji

    Remove-Item chuchel_uzivatele.csv -ErrorAction SilentlyContinue
    
  • Získám první stránku s uživateli a nastavím si NextPageToken abych věděl na kterou další stránku mám jít. Potom zapíšu výsledek do souboru:

    $RESPONSE = $(curl.exe `
      "https://admin.googleapis.com/admin/directory/v1/users?key=$PAPI_KEY&domain=<DOMÉNA>&maxResults=500" `
      --header "Authorization: Bearer $ACCESS_TOKEN" `
      --header 'Accept: application/json' | ConvertFrom-JSON)
    $NextPageToken = $RESPONSE.nextPageToken
    
    Write-Host "NEXT PAGE TOKEN: $NextPageToken.nextPageToken" -ForegroundColor Yellow
    $RESPONSE.users | ConvertTo-Csv -Delimiter ';' >> chuchel_uzivatele.csv
    
  • Cyklem získáme další stránky dokud budeme dostávat odpověď:

    while ($NextPageToken -notlike ""){
    $RESPONSE = $(curl.exe `
      "https://admin.googleapis.com/admin/directory/v1/users?key=$PAPI_KEY&domain=<DOMÉNA>&maxResults=500&pageToken=$NextPageToken" `
      --header "Authorization: Bearer $ACCESS_TOKEN" `
      --header 'Accept: application/json' | ConvertFrom-JSON)
    $NextPageToken = $RESPONSE.nextPageToken
    
    Write-Host "NEXT PAGE TOKEN: $NextPageToken.nextPageToken" -ForegroundColor Yellow
    $RESPONSE.users | ConvertTo-Csv -Delimiter ';' >> chuchel_uzivatele.csv
    Get-Content chuchel_uzivatele.csv | Measure-Object | select Count
    }
    

Načtení csv do PowerShellu

  • Takto si vylistuje všechny co se nikdy nepřihlásili a nemají username lvice*@<DOMÉNA>:
    $ALL_USERS | Where { $_.lastLoginTime -eq '1970-01-01T00:00:00.000Z' -and $_.primaryEmail -notlike "lvice*@<DOMÉNA>" | Select id,primaryEmail
    
    • Jak tyhle lidi odstraním?

      $ALL_USERS | `
        $ALL_USERS | Where { $_.lastLoginTime -eq '1970-01-01T00:00:00.000Z' -and $_.primaryEmail -notlike "lvice*@<DOMÉNA> | Select id,primaryEmail | `
        Select id,primaryEmail | Select -Last 700 | `
        ForEach {
          $USER_ID = $_.id
          $USER_EMAIL = $_.primaryEmail
          Write-Host "Removing user with ID $USER_ID, email $USER_EMAIL" -ForegroundColor Red
      
        curl.exe --request DELETE `
        "https://admin.googleapis.com/admin/directory/v1/users/${USER_ID}?domain=<DOMÉNA>" `
        --header "Authorization: Bearer $ACCESS_TOKEN" `
        --header 'Accept: application/json' `
        --compressed
        }
      
    • Sakra, odstranil jsem nějaký konta nechtíc, tak takhle je od-odstraním:

      $ALL_USERS | `
         Where { $_.primaryEmail -like "u3v*@<DOMÉNA>"  } | `
         Select id,primaryEmail | `
        ForEach {
          $USER_ID = $_.id
          $USER_EMAIL = $_.primaryEmail
          Write-Host "UN-Removing user with ID $USER_ID, email $USER_EMAIL" -ForegroundColor Yellow
      
        curl.exe --request POST `
        "https://admin.googleapis.com/admin/directory/v1/users/${USER_ID}/undelete?domain=<DOMÉNA>" `
        --header "Authorization: Bearer $ACCESS_TOKEN" `
        --header 'Accept: application/json' `
        --header 'Content-Type: application/json' `
        --data '{}' `
        --compressed
        }