【问题标题】:How do I use Google API to add custom domain mapping in App Engine?如何使用 Google API 在 App Engine 中添加自定义域映射?
【发布时间】:2018-12-15 19:52:09
【问题描述】:

我正在尝试使用 Google API(而不是通过控制台)将自定义域映射添加到我的 App Engine 应用程序。但是,当使用 Discovery API 客户端发出 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"

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      他们的文档中有一个特殊页面用于在应用引擎上使用此库: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', []),
                  }
      

      【讨论】:

      • 我刚刚尝试更改凭据,但没有成功。我怀疑该错误与 json 中的 body 参数有关。我找不到任何涉及 json 参数的示例
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 2014-03-13
      • 1970-01-01
      • 2017-04-08
      • 2015-11-07
      • 2014-02-01
      • 1970-01-01
      相关资源
      最近更新 更多