32

我正在尝试使用此代码通过 Python 客户端访问 google 应用程序以获得授权(显然已编辑私人信息):

import gflags
import httplib2

from apiclient.discovery import build
from oauth2client.file import Storage
from oauth2client.client import SignedJwtAssertionCredentials
from oauth2client.tools import run

f = open('privatekey.p12', 'rb')
key = f.read()
f.close()
credentials = SignedJwtAssertionCredentials(
    service_account_name='name@developer.gserviceaccount.com',
    private_key=key,
    scope = 'https://www.googleapis.com/auth/calendar')
http = httplib2.Http()
http = credentials.authorize(http)
service = build(serviceName='calendar', version='v3', http=http)

然而我收到这个错误:

ImportError: cannot import name SignedJwtAssertionCredentials

我已经安装了 Google v3 API Python 客户端以及 OAuth2;我似乎对这些模块没有任何其他问题,尽管我没有太多使用它们。有谁知道发生了什么?

4

8 回答 8

72

我今天遇到了这个问题,不得不从 oauth2client 2.0 版回滚到 1.5.2 版:

pip install oauth2client==1.5.2
于 2016-02-17T04:07:36.517 回答
22

好像你还没有安装 pyopenssl。通过安装easy_install pyopenssl

Libraries oauth2client.client
if HAS_OPENSSL:
  # PyOpenSSL is not a prerequisite for oauth2client, so if it is missing then
  # don't create the SignedJwtAssertionCredentials or the verify_id_token()
  # method.

  class SignedJwtAssertionCredentials(AssertionCredentials):
....
于 2013-01-04T15:01:15.073 回答
8

源存储库最近更新,以使用新代码:

from apiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials

...
于 2016-03-03T14:53:48.333 回答
4

正如 alexander margraf 所说,您需要 PyOpenSSL 来导入 SignedJwtAssertionCredentials

简单地说: pip install pyopenssl

请记住:如果您没有安装 OpenSSL Win32 库http://slproweb.com/products/Win32OpenSSL.html(您需要完整的软件包,而不是精简版),它将在 Windows 上失败。另请记住,在安装 pyopenssl 之前,您需要将其添加到路径变量中

于 2013-03-22T19:01:09.537 回答
3

我试图建立一个本地开发环境,但这里的解决方案都没有奏效。对我来说,难题中的额外部分是:

$ pip install pycrypto

可能除了以下任何或全部:

$ pip install pyopenssl
$ pip install httplib2
$ pip install oauth2client
$ pip install ssl

GAEpycrypto内部有可用的包(检查你的 app.yaml 中列出的库),所以需要它的东西可能在他们的机器上工作,但不是你的机器 - 我想 - 抱歉,我还不清楚他们让生活如此美好的原因和原因对图书馆很痛苦。

于 2014-09-17T11:48:12.020 回答
2

首先检查您的oauth2client版本。

如果此版本 >= 2.0,则使用ServiceAccountCredentials代替SignedJwtAssertionCredentials.

看三个参考:

于 2016-06-08T13:50:11.370 回答
1

检查您的 'oauth2client' 模块版本,如果是这样,您可能正在使用高于 1.5.2 的版本,您可以通过降级版本并重新安装 1.5.2 或 'oauth2client.client.AccessTokenCredentials' 来解决此问题。文档链接https://oauth2client.readthedocs.io/en/latest/source/oauth2client.client.html

于 2018-11-11T20:25:20.227 回答
1

您可以为 oauth2client 版本 >= 2.0 尝试此操作,

from oauth2client.service_account import ServiceAccountCredentials

ServiceAccountCredentials.from_p12_keyfile(
    service_account_email='name@developer.gserviceaccount.com', 
    filename=KEY_PATH, 
    scopes='https://www.googleapis.com/auth/calendar')
于 2019-11-18T11:38:01.343 回答