如何使用Google API在App Engine中添加自定义域映射?

时间:2018-07-07 12:45:29

标签: google-app-engine google-api-python-client

我正在尝试使用Google API(而不是通过控制台)向我的App Engine应用添加自定义域映射。但是,使用Discovery API Client发出http请求时,我不断收到403禁止错误。我已经从App Engine获得了拥有所有者权限的凭据json文件,并使用GOOGLE_APPLICATION_CREDENTIALS env变量指向该文件。由于我拥有完整的权限,所以我猜问题是我没有正确使用API​​,但无法查看缺少的内容。

os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = os.path.dirname(__file__) + str('/json_cred_file')

apps_client = googleapiclient.discovery.build('appengine', 'v1beta')

response = apps_client.apps().domainMappings().create(
        appsId='apps/myappname', body=json.loads(
        '{"id": "newsubdomain.mydomain.com","sslSettings": '
        '{"sslManagementType": "AUTOMATIC"  }}')).execute()

这是错误:

WARNING  2018-07-06 23:51:09,331 http.py:119] Encountered 403 Forbidden with reason "forbidden"

2 个答案:

答案 0 :(得分:1)

我联系了Google支持人员,问题是使用域映射功能时,需要将该服务帐户作为所有者添加到搜索控制台。这是搜索控制台:https://www.google.com/webmasters/tools/home

答案 1 :(得分:0)

他们在文档中有一个特殊页面,可以在应用程序引擎上使用此库:https://developers.google.com/api-client-library/python/guide/google_app_engine

这就是我使用googleapiclient库的方式。我看到的区别是这一行:

credentials = GoogleCredentials.get_application_default()

from oauth2client.client import GoogleCredentials
from lib.googleapiclient import discovery

class DataFlowJobsListHandler(AdminResourceHandler):

    def get(self, resource_id=None):
        """
        Wrapper to this:
        https://cloud.google.com/dataflow/docs/reference/rest/v1b3/projects.jobs/list
        """
        if resource_id:
            self.abort(405)
        else:
            credentials = GoogleCredentials.get_application_default()
            service = discovery.build('dataflow', 'v1b3', credentials=credentials)
            project_id = app_identity.get_application_id()
            _filter = self.request.GET.pop('filter', 'UNKNOWN').upper()

            jobs_list_request = service.projects().jobs().list(
                projectId=project_id,
                filter=_filter)  #'ACTIVE'
            jobs_list = jobs_list_request.execute()

            return {
                '$cursor': None,
                'results': jobs_list.get('jobs', []),
            }