Проблемы при запросе API Google Workspace Enterprise License Manager

#python-3.x #google-api #google-admin-sdk #google-workspace #google-app-engine-python

# #python-3.x #google-api #google-admin-sdk #google-workspace #google-app-engine-python

Вопрос:

Я разрабатываю приложение на Python 3.7, которое предназначено для развертывания в Google App Engine. Цель этого приложения — запросить API-интерфейс Google Workspace Enterprise License Manager, чтобы получить список пользователей по лицензии Google Workspace. Итак, подводя итог, основная цель этого приложения — запросить метод licenseAssignments.listForProduct API.

Я уже разработал приложение, которое управляет файлом GDrive через GSuite API, используя учетную запись службы. Поэтому для этого нового приложения и для целей тестирования я продолжаю использовать ту же учетную запись службы. Наш администратор GSuite предоставил этой учетной записи Службы область действия

«https://www.googleapis.com/auth/apps.licensing «.

Я следую справочному руководству, поэтому API Enterprise License Manager включен в моем проекте на GCP, а API включен в консоли администратора Google Workspace (наш администратор GSuite успешно использует API Google Workspace Enterprise License Manager через Powershell).

Вот мой код:

 from google.oauth2 import service_account
from googleapiclient.discovery import build

CUSTOMER_ID = 'HIDDEN_FOR_SECURITY_PURPOSE'

SERVICE_ACCOUNT_FILE = "service_account_file.json"
SCOPES = "https://www.googleapis.com/auth/apps.licensing"

def get_cred():
    try:
        creds = service_account.Credentials.from_service_account_file(
            SERVICE_ACCOUNT_FILE, scopes=SCOPES
        )
    except Exception as e:
        print(e)

    return creds


if __name__ == "__main__":
    creds = get_cred()
    service = build('licensing', 'v1', credentials=creds)
    try:
        response = service.licenseAssignments().listForProduct(customerId='HIDDEN_FOR_SECURITY_PURPOSE', productId='Google-Apps' ).execute()
    except Exception as e:
        print(e)
 

При запуске этого кода через App Engine или на моем компьютере через Jupyter Notebook я получаю эту ошибку:

('No access token in response.', {'id_token': 'JWT_TOKEN_HIDDEN_FOR_SECURITY_PURPOSE'})

Версии Lib:

  • Python 3.7
  • google-api-python-client == 1.7.11
  • google-auth == 1.20.1

Спасибо за вашу помощь!


Редактировать:

Я развернул следующий код на GAE:

 from google.cloud import bigquery
from google.oauth2 import service_account
from googleapiclient.discovery import build
import requests
import json
import pandas as pd


SERVICE_ACCOUNT_FILE = "service_account_file.json"
SCOPES = ["https://www.googleapis.com/auth/apps.licensing"]


app = Flask(__name__)


def get_cred():
    try:
        creds = service_account.Credentials.from_service_account_file(
            SERVICE_ACCOUNT_FILE, scopes=SCOPES
        )
    except Exception as e:
        print(e)
        return e

    return creds


@app.route("/")
def main():

    print("## Start")
    creds = get_cred()
    service = build("licensing", "v1", credentials=creds)
    try:
        response = (
            service.licenseAssignments()
            .listForProduct(customerId="HIDDEN_FOR_SECURITY_PURPOSE", productId="Google-Apps")
            .execute()
        )
        print("## Response={}".format(response))
    except Exception as e:
        print(e)

    print("## End")

    return "OK"


if __name__ == "__main__":
    # This is used when running locally only. When deploying to Google App
    # Engine, a webserver process such as Gunicorn will serve the app. This
    # can be configured by adding an `entrypoint` to app.yaml.
    app.run(host="127.0.0.1", port=8080, debug=True)
# [END gae_python37_app]
 

Я получаю сообщение об ошибке <HttpError 503 when requesting https://licensing.googleapis.com/apps/licensing/v1/product/Google-Apps/users?customerId=[HIDDEN_FOR_SECURITY_PURPOSE]amp;alt=json returned "Backend Error". Details: "Backend Error"> .

Комментарии:

1. Насколько я вижу, этот api не поддерживает учетные записи служб, авторизующие , что заставляет вас думать, что это так?

Ответ №1:

использует ли ваша учетная запись службы делегирование в масштабах всего домена? и если да, то выдает ли он себя за пользователя, у которого есть разрешения RBAC для просмотра лицензий?

Используйте API explorer https://developers.google.com/admin-sdk/licensing/reference/rest/v1/licenseAssignments/listForProduct?apix_params={«productId»:»Google-Apps»,»customerId»:»XXXXXX PUT YOUR CUST ID HERE»}amp;apix=true

И выполните аутентификацию пользователя, за которого вы пытаетесь выдать себя, и посмотрите, получите ли вы ответ.

Если вам, по-видимому, не нужно выдавать себя за суперадминистратора, и если вы не выполняете олицетворение, которое сначала должно быть включено в консоли GCP, тогда область действия должна быть авторизована в домене, что, как вы упомянули, произошло.