【问题标题】:pygsheets - Load credentials from dict instead of filepygsheets - 从字典而不是文件加载凭据
【发布时间】:2019-06-29 11:30:08
【问题描述】:

是否可以从 dict 而不是文件加载凭据?这将使在云函数中使用短脚本变得更容易,因为这样就不需要上传文件了。通常授权是这样的:

import pygsheets
gc = pygsheets.authorize(service_file='client_secret.json')

如果凭据存储在 a 变量中,如下所示:

secret = {
  "type": "service_account",
  "project_id": "XXXXXXXXXX",
  "private_key_id": "XXXXXXXXXX",
  "private_key": "XXXXXXXXXX"
  "client_email": "XXXXXXXXXX",
  "client_id": "XXXXXXXXXX",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "XXXXXXXXXX"
}

是否可以使用custom_credentials 而不是service_file 加载它们? docs 没有给出任何关于如何使用它的说明,除了“这个选项将忽略任何其他参数”。以下代码:

import pygsheets
gc = pygsheets.authorize(custom_credentials=secret)

抛出以下错误:

AttributeError: 'dict' object has no attribute 'before_request'

还有其他方法可以做到这一点吗?例如,gspread 中有以下选项:

ServiceAccountCredentials.from_json_keyfile_dict(keyfile_dict, scope)

有什么建议吗?谢谢!!!

【问题讨论】:

    标签: python python-3.x gspread pygsheets


    【解决方案1】:

    刚刚做到了!所以我们最终做的是写一个tempfile,然后加载它以进行授权。下面的工作示例:

    import tempfile
    
    def _google_creds_as_file():
        temp = tempfile.NamedTemporaryFile()
        temp.write(json.dumps({
            "type": "service_account",
            "project_id": "xxxx-yyy",
            "private_key_id": "xxxxxxx",
            "private_key": "-----BEGIN PRIVATE KEY----------END PRIVATE KEY-----\n",
            "client_email": "xxx@yyyy.iam.gserviceaccount.com",
            "client_id": "xxxxx",
            "auth_uri": "https://accounts.google.com/o/oauth2/auth",
            "token_uri": "https://oauth2.googleapis.com/token",
            "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
            "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/xxxxx%40xxxx.iam.gserviceaccount.com"
        }))
        temp.flush()
        return temp
    
    creds_file = _google_creds_as_file()
    gc = pygsheets.authorize(service_account_file=creds_file.name)
    

    【讨论】:

    • 为我工作。需要进行的一项更改是将json.dumps() 的输出转换为带有.encode('utf-8') 的字节,以便写入临时文件。
    【解决方案2】:

    感谢@kontinuity 的建议。经过一番挖掘,我发现实际上已经有一个拉取请求: https://github.com/nithinmurali/pygsheets/pull/345

    authorization.py 中有一个名为service_account_env_var 的新选项。刚刚试了一下,效果很好。

    【讨论】:

      【解决方案3】:

      custom_credentials 应该是 here 中提到的凭据对象。如果不想创建tmp文件,可以直接从json创建对象。

      SCOPES = ('https://www.googleapis.com/auth/spreadsheets', 'https://www.googleapis.com/auth/drive')
      service_account_info = json.loads(secret)
      my_credentials = service_account.Credentials.from_service_account_info(service_account_info, scopes=SCOPES)
      

      【讨论】:

        猜你喜欢
        • 2011-01-11
        • 2011-08-30
        • 2020-02-15
        • 2019-03-25
        • 1970-01-01
        • 2014-09-12
        • 1970-01-01
        • 1970-01-01
        • 2013-08-07
        相关资源
        最近更新 更多