Доступ к G Suite Admin SDK с использованием служебной учетной записи - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь использовать служебную учетную запись для доступа к API-интерфейсу каталога (https://developers.google.com/admin-sdk/directory/v1/reference/users/list).). Самая простая задача - составить список пользователей в организации. Это хорошо работает с моей учетной записью, протестированной с помощью OAuth 2.0 Playgorund. Но я Мне нужно использовать служебную учетную запись. Я следую документации по двухстороннему OAuth (https://developers.google.com/identity/protocols/OAuth2ServiceAccount) и внедряю REST-клиент в Powershell

  • Доступ к API включен в консоли администратора Google
  • Учетная запись службы создана и загружены учетные данные P12. Этой учетной записи предоставляется несколько общеорганизационных ролей в Cloud Console: браузер, Security Reviewer, Organization Viewer - для тестирования различных сценариев
  • Полномочия для всего домена предоставляются в консоли администратора с областью действия API https://www.googleapis.com/auth/admin.directory.user

Код Powershell:

    # Forming the JWT claim set

    $cert = Get-PfxCertificate -FilePath "c:\ps\GAdmin\apiaccess-123456.p12" -Password (ConvertTo-SecureString "notasecret" -AsPlainText -Force)

    $now = (Get-Date).ToUniversalTime()
    $createDate = [Math]::Floor([decimal](Get-Date($now) -UFormat "%s"))
    $expiryDate = [Math]::Floor([decimal](Get-Date($now.AddHours(1)) -UFormat "%s"))

    $rawclaims = [Ordered]@{
            iss = "p12service@apiaccess-123456.iam.gserviceaccount.com"
            scope = "https://www.googleapis.com/auth/admin.directory.user"
            aud = "https://www.googleapis.com/oauth2/v4/token"
            iat = $createDate
            exp = $expiryDate
    } | ConvertTo-Json

    # Encoding the JWT claim set

    $jwt = New-Jwt -PayloadJson $rawclaims -Cert $cert -Verbose

    # Making the access token request

    $apiendpoint = "https://www.googleapis.com/oauth2/v4/token"

    $splat = @{
            Method = "POST"
            Uri = $apiendpoint
            ContentType = "application/x-www-form-urlencoded"
            Body = "grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=$jwt"
    }

    $res = Invoke-WebRequest @splat -Verbose

    $accesstoken = ($res.content | ConvertFrom-Json).access_token

    # Calling Google APIs - list of users

    $usersapiendpoint = "https://www.googleapis.com/admin/directory/v1/users?list&customer=my_customer&domain=mydomain.com.au"

    $splat = @{
            Method = "GET"
            Uri = $usersapiendpoint
            Headers = @{authorization = "Bearer $accesstoken"}
    }

    $userlistres = Invoke-WebRequest @splat -Verbose

В результате ошибка :

code 403, "Not Authorized to access this resource/api"

Вызов других API работает. Что мне нужно сделать, чтобы разрешить программный доступ к API-интерфейсу каталога? Я пропускаю шаг настройки для учетной записи службы / доступа к SDK?

1 Ответ

0 голосов
/ 01 октября 2018

Получил это работает! Делегирование и олицетворение полномочий на уровне домена (запись sub = "user@example.com" в $ rawclaims) были необходимы и правильны.

Проблема заключалась в том, что имелось несоответствие между привилегиями, предоставленными учетной записи службы через делегирование всего домена, и теми, которые были запрошены в моей заявке (у меня их было несколько):

scope = "https://www.googleapis.com/auth/admin.directory.user https://www.googleapis.com/auth/iam https://www.googleapis.com/auth/cloud-platform"

После того, как требования соответствовали предоставленным привилегиям, я получил свои токены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...