powershell - 使用服务帐户访问 G Suite Admin SDK

标签 powershell google-cloud-platform google-oauth google-admin-sdk google-directory-api

我正在尝试使用服务帐户访问目录 API (https://developers.google.com/admin-sdk/directory/v1/reference/users/list)。最简单的任务是列出组织中的用户。这适用于我的用户帐户,使用 OAuth 2.0 Playgorund 进行了测试。但我需要使用服务帐户。我正在关注双足 OAuth ( https://developers.google.com/identity/protocols/OAuth2ServiceAccount ) 的文档并在 Powershell 中实现 REST 客户端

  • 在 Google 管理控制台中启用 API 访问权限
  • 创建服务帐户并下载 P12 凭据。该帐号在 Cloud Console 中被授予多个组织范围的角色:浏览器、安全审查者、组织查看者 - 以便测试各种场景
  • 在管理控制台中授予域范围的权限,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

这会导致错误:

代码 403,“未授权访问此资源/api”

调用其他 API 有效。我需要做什么才能启用对 Directory API 的编程访问?我是否缺少服务帐户/SDK 访问的配置步骤?

最佳答案

成功了!域范围的权限委托(delegate)和模拟($rawclaims 中的 sub = "user@example.com" 条目)是必要且正确的。

问题是通过全域委派授予服务帐户的权限与我声明中请求的权限(我有几个)不匹配:

scope = "https://www.googleapis.com/auth/admin.directory.user https://www.googleapis.com/auth/iam https://www.googleapis.com/auth/云平台”

一旦声明与授予的权限匹配,我就会收到我的 token 。

关于powershell - 使用服务帐户访问 G Suite Admin SDK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50265150/

相关文章:

mysql - 尝试连接到托管在 Google Compute Engine Ubuntu VM 上的 SQL 服务器时如何解决此错误

google-cloud-platform - 谷歌云 : How to connect the google cloud storage to cloud CDN without making the bucket public?

javascript - 使用来自客户端应用程序的 Doorkeeper 进行身份验证而不传输 secret

php - 如何在没有手动授权的情况下从 php 脚本访问我的谷歌驱动器

powershell - 在 PowerShell 中复制文件并将日期添加到其名称

bash - 如何在一行中设置环境变量和执行命令(PowerShell)?

python - 如何部署 GCP App Engine Worker?

string - 表示小时的格式字符串为 H :MM in output

powershell - 你能实现一个动态创建的 PSObject 以便相等和比较工作吗?

c# - Google 的间歇性 ASP.NET oAuth 问题,AuthenticationManager.GetExternalIdentityAsync 返回 null