Reputation: 11794
I'm trying to access a google app through the Python Client using this code to gain authorization (private info obviously redacted):
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='[email protected]',
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)
Yet I receive this error:
ImportError: cannot import name SignedJwtAssertionCredentials
I have installed the Google v3 API Python Client as well as OAuth2; I don't seem to be having any other problems with those modules, though I haven't used them much. Anyone know what's going on?
Upvotes: 34
Views: 50973
Reputation: 2643
You can try this for oauth2client version >= 2.0,
from oauth2client.service_account import ServiceAccountCredentials
ServiceAccountCredentials.from_p12_keyfile(
service_account_email='[email protected]',
filename=KEY_PATH,
scopes='https://www.googleapis.com/auth/calendar')
Upvotes: 2
Reputation: 356
Check your `oauth2client' module version, probably you are using greater then 1.5.2 version if that is so, you can fix this problem by downgrading the version and reinstalling the 1.5.2 or 'oauth2client.client.AccessTokenCredentials'. Documentation link https://oauth2client.readthedocs.io/en/latest/source/oauth2client.client.html
Upvotes: 1
Reputation: 52313
I was trying to build a local dev environment and none of the solutions here were working. The extra piece in the puzzle for me was:
$ pip install pycrypto
possibly in addition to any or all of:
$ pip install pyopenssl
$ pip install httplib2
$ pip install oauth2client
$ pip install ssl
GAE has the pycrypto
package available internally (check the libraries listed in your app.yaml) so something needing it might work on their machines but not yours - I think - sorry I'm not yet clear on what and why they're making life so miserable with the libraries yet.
Upvotes: 3
Reputation: 320
Check your oauth2client
version first.
If this version >= 2.0, using the ServiceAccountCredentials
instead of SignedJwtAssertionCredentials
.
Look at the three reference:
Upvotes: 2
Reputation: 5168
The source repository was recently updated, to make use of the new code:
from apiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials
...
Upvotes: 9
Reputation: 244
It seems like you havn't installed pyopenssl. Install via 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):
....
Upvotes: 22
Reputation: 3144
I had this problem today and had to roll back from oauth2client version 2.0 to version 1.5.2 with:
pip install oauth2client==1.5.2
Upvotes: 75
Reputation: 379
As alexander margraf said you need PyOpenSSL to import SignedJwtAssertionCredentials
simply: pip install pyopenssl
REMEMBER: It will fail on Windows if you don't have OpenSSL Win32 libs installed http://slproweb.com/products/Win32OpenSSL.html (you need full package, not the light version). Also keep in mind you need to add it to your path var before installing pyopenssl
Upvotes: 4