【问题标题】:Invalid Credentials accessing Big Query tables from App Engine application从 App Engine 应用程序访问 Big Query 表的凭据无效
【发布时间】:2016-08-03 11:04:45
【问题描述】:

有人可以帮我从 App Engine 应用程序访问 Big Query 吗?

我已完成以下步骤-

创建了一个 App Engine 项目。

将 google-api-client、oauth2client 依赖项(等)安装到 /lib 中。

通过云控制台为 Ap​​p Engine 项目启用 Big Query API。

创建了一些“应用程序默认凭据”(一个“服务帐户密钥”)[JSON] 并将其/它们保存到 App Engine 应用程序的根目录。

根据以下内容创建了“大查询服务资源”-

def get_bigquery_service():
    from googleapiclient.discovery import build
    from oauth2client.client import GoogleCredentials
    credentials=GoogleCredentials.get_application_default()
    bigquery_service=build('bigquery', 'v2', credentials=credentials)
    return bigquery_service

已验证资源存在 -

<googleapiclient.discovery.Resource object at 0x7fe758496090>

尝试使用以下方式查询资源(ProjectId 是 App Engine 应用程序的简称) -

bigquery=get_bigquery_service()
bigquery.tables().list(projectId=#{ProjectId},
                   datasetId=#{DatasetId}).execute()

返回以下 -

<HttpError 401 when requesting https://www.googleapis.com/bigquery/v2/projects/#{ProjectId}/datasets/#{DatasetId}/tables?alt=json returned "Invalid Credentials">

关于我可能有错误或遗漏的步骤有什么想法吗?整个身份验证过程似乎是一场噩梦,与 App Engine/PaaS 的易用性理念大相径庭:-(

谢谢。

【问题讨论】:

    标签: google-app-engine


    【解决方案1】:

    好吧,尽管我是 Google Cloud 的粉丝,但这绝对是我很不幸不得不在一段时间内工作的最糟糕的事情。糟糕/不一致/不存在的文档、复杂性、错误等。尽可能避免!

    1) 确保您的 App Engine“默认服务帐户”存在

    https://console.cloud.google.com/apis/dashboard?project=XXX&duration=PTH1

    您可以选择创建默认服务帐户仅当它尚不存在时。如果您不小心删除了它,您将需要一个新项目;你无法重新创建它。

    How to recover Google App Engine's "default service account"

    您可能应该创建一组默认的 JSON 凭据,但您不需要将它们作为项目的一部分。

    您不需要为 Big Query 或其他方式创建任何其他服务帐户。

    2) 安装 google-api-python-client 并应用修复

    pip install -t lib google-api-python-client
    

    假设这安装了 oath2client 3.0.x,那么在测试时你会得到以下抱怨:

    File "~/oauth2client/client.py", line 1392, in _get_well_known_file
    default_config_dir = os.path.join(os.path.expanduser('~'),
    File "/usr/lib/python2.7/posixpath.py", line 268, in expanduser
    import pwd
    File "~/google_appengine-1.9.40/google/appengine/tools/devappserver2/python/sandbox.py", line 963, in load_module
    raise ImportError('No module named %s' % fullname)
    ImportError: No module named pwd
    

    您可以通过更改 ~/oauth2client/client.py [line 1392] 来修复:

    os.path.expanduser('~')
    

    到:

    os.env("HOME")
    

    并将以下内容添加到 app.yaml:

    env_variables:
      HOME: '/tmp'
    

    丑陋但有效。

    3) 下载GCloud SDK并从控制台登录

    https://cloud.google.com/sdk/

    gcloud auth login
    

    这里的问题是 App Engine 的 dev_appserver.py 不包含任何 Big Query 复制 (natch);因此,当您与 Big Query 表进行交互时,您正在使用的是生产数据;您需要登录才能访问。

    回想起来很明显,但记录不充分。

    4) 在 App Engine 控制台中启用 Big Query API;创建 Big Query ProjectID

    https://console.cloud.google.com/apis/dashboard?project=XXX&duration=PTH1

    https://bigquery.cloud.google.com/welcome/XXX

    5) 测试

    from oauth2client.client import GoogleCredentials
    credentials=GoogleCredentials.get_application_default()
    from googleapiclient.discovery import build
    bigquery=build('bigquery', 'v2', credentials=credentials)
    print bigquery.datasets().list(projectId=#{ProjectId}).execute()
    

    [或类似的]

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2019-06-02
      • 2012-06-13
      • 1970-01-01
      • 2015-10-17
      • 2012-07-19
      • 2019-04-26
      • 2020-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多