2013-04-15 39 views
8

Picasa'dan fotoğraf çekmek ve çekmek için data.photos.service.PhotosService kullanmak istiyorum. Google konsolundan XXXXXXXX-privatekey.p12 adlı bir hizmet anahtarı dosyam var ve şimdi söz konusu anahtarı google ile kullanarak kimlik doğrulamaya çalışıyorum.Oitak2'yi pithon'da gdata üzerinde hizmet hesabıyla kullanma

f = file(settings.SITE_ROOT + '/aurora/' + settings.PRIVATE_KEY, 'rb') 
key = f.read() 
f.close() 

credentials = SignedJwtAssertionCredentials(settings.SERVICE_ACCOUNT_NAME, key, scope = 'http://picasaweb.google.com/data https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile') 
http = httplib2.Http() 
http = credentials.authorize(http) 
service = build("oauth2", "v2", http=http) 
user_info = None 
try: 
    user_info = service.userinfo().get().execute() 
    # neither of these two methods work 
    #gd_client.SetOAuthInputParameters(signature_method = gdata.auth.OAuthSignatureMethod.RSA_SHA1, consumer_key = "asdfasdfasdf.apps.googleusercontent.com", rsa_key = key, two_legged_oauth = True, requestor_id = user_info.get('email')) 
    #gd_client.auth_token = gdata.gauth.TwoLeggedOAuthRsaToken(consumer_key = user_info.get('email'), rsa_private_key = key, requestor_id = user_info.get('email')) 
except errors.HttpError, e: 
    logging.error('An error occurred: %s', e) 

user_inf0 = {u'verified_email': True, u'id': u'1234', u'name': u'[email protected]', u'email': u'[email protected]'} 

konu yöntemi ya 1 SetOAuthInputParameters kullanarak 2 döner bir bir geçersiz jetonu veya yöntemi döndüren şudur:

OAuth2 kullanarak AppEngine'de belgeleri aşağıdakilerden kullanarak kullanım olacağına inanmak için bana yol açmıştır 403 restricted.

Ben gerçekten ve gerçekten bu şekilde yapmak istemiyorum zaman düzenli 3 bacaklı oauth yapan kod dağları aracılığıyla benim wits 'sonunda okuma. Henüz görmediğim fikirler/makaleler var mı?

cevap

19

gdata.gauth.OAuth2TokenFromCredentials öğesini kullanın.

auth2token = gdata.gauth.OAuth2TokenFromCredentials(credentials) 
gd_client = auth2token.authorize(gd_client) 

OAuth2TokenFromCredentials aynı anda apiclient ve GData'yı kullanmanıza yardımcı olmak için tasarlanmıştır. Kapakların altında, gdata çağrılarını gerçekleştirmek için ihtiyaç duyduğu yetki bilgisine sahip olduğundan emin olmak için kimlik bilgilerini kullanır.

Not: Hala 403 alırsanız, tamamen başka bir şey olabilir. Bir kullanıcının verilerine erişmek için bir hizmet hesabı kullanıyordum ve 403 alıyordum çünkü kullanıcıyı SignedJwtAssertionCredentials çağrısında düzgün bir şekilde belirtmemiştim.

GÜNCELLEME:

from oauth2client.client import SignedJwtAssertionCredentials 
credentials = SignedJwtAssertionCredentials(
    "[email protected]", 
    open("keyfile").read(), 
    scope=(
        "https://www.googleapis.com/auth/drive", 
        "https://spreadsheets.google.com/feeds", 
        "https://docs.google.com/feeds" 
    ), # For example. 
    sub="[email protected]" 
) 
http = httplib2.Http() 
http = credentials.authorize(http) # Not needed? See comment below. 
auth2token = gdata.gauth.OAuth2TokenFromCredentials(credentials) 
gd_client = gdata.photos.service.PhotosService() # For example. 
gd_client = auth2token.authorize(gd_client) 
+0

nasıl 'çağırmak SignedJwtAssertionCredentials' kullanıcıyı belirtmek mı? – Gautam

+1

Cevabı güncelledim. –

+0

Bununla birlikte HTTP 400'ü alıyorum, elektronik tablo API'sini kullanıyorum – Gautam

0

Eğer google hesabına MFA kullanıyorsanız, sen rıza ekran kimlik doğrulama yöntemini kullanmak gerekir: İşte kullanılan temel desen bu. Picassa API'siyle, istek API'sı biraz farklı olduğu için çalışmaz.

import gdata.gauth 
import os 
import pickle 
import gdata.photos.service 

clientid='xxx' # https://console.developers.google.com/apis/credentials 
clientsecret='xxx' 
Scope='https://picasaweb.google.com/data/' 
User_agent='myself' 

def GetAuthToken(): 
    if os.path.exists(".token"): 
     with open(".token") as f: 
      token = pickle.load(f) 
    else: 
     token = gdata.gauth.OAuth2Token(client_id=clientid,client_secret=clientsecret,scope=Scope,user_agent=User_agent) 
     print token.generate_authorize_url(redirect_uri='urn:ietf:wg:oauth:2.0:oob') 
     code = raw_input('What is the verification code? ').strip() 
     token.get_access_token(code) 
     with open(".token", 'w') as f: 
      pickle.dump(token, f) 
    return token 


token = GetAuthToken() 

gd_client = gdata.photos.service.PhotosService() 
old_request = gd_client.request 


def request(operation, url, data=None, headers=None): 
    headers = headers or {} 
    headers['Authorization'] = 'Bearer ' + token.access_token 
    return old_request(operation, url, data=data, headers=headers) 


gd_client.request = request 
photos = gd_client.GetUserFeed(kind='photo', limit='10') 
for photo in photos.entry: 
    print 'Recently added photo title:', photo.title.text