2011-03-04 5 views
8

Je souhaite utiliser Oauth pour me connecter à Gmail en Python. En ce moment, j'ai le script xoauth.py de Google (link), et générer un token fonctionne très bien, mais comment puis-je l'utiliser dans un autre script? Ça va être à Django.utiliser imaplib et oauth pour la connexion avec Gmail

En ce moment, mon script se connecte comme ceci:

m = imaplib.IMAP4_SSL("imap.gmail.com") 
m.login("[email protected]", "password") 

Mais je veux quelque chose de plus sûr.

Répondre

11

Voici un exemple en utilisant le oauth2 module pour authentifier en utilisant OAuth, pris du readme:

import oauth2 as oauth 
import oauth2.clients.imap as imaplib 

# Set up your Consumer and Token as per usual. Just like any other 
# three-legged OAuth request. 
consumer = oauth.Consumer('your_consumer_key', 'your_consumer_secret') 
token = oauth.Token('your_users_3_legged_token', 
    'your_users_3_legged_token_secret') 

# Setup the URL according to Google's XOAUTH implementation. Be sure 
# to replace the email here with the appropriate email address that 
# you wish to access. 
url = "https://mail.google.com/mail/b/[email protected]/imap/" 

conn = imaplib.IMAP4_SSL('imap.googlemail.com') 
conn.debug = 4 

# This is the only thing in the API for impaplib.IMAP4_SSL that has 
# changed. You now authenticate with the URL, consumer, and token. 
conn.authenticate(url, consumer, token) 

# Once authenticated everything from the impalib.IMAP4_SSL class will 
# work as per usual without any modification to your code. 
conn.select('INBOX') 
print conn.list() 

Un peu plus propre que l'utilisation xoauth.

+0

Bonjour Acorn, je suis nouveau sur oauth2 et imaplib , et j'ai quelques questions maintenant, pouvez-vous y répondre à: http://stackoverflow.com/questions/17976626/oauth2-and-imap-connection-with-gmail – Cacheing

+1

Je ne comprends pas où "your_users_3_legged_token" et "your_users_3_legged_token_secret "proviennent de:/ – daveoncode

3

Voici un exemple de connexion à IMAP en utilisant des routines présentes dans le xoauth.py de Google. Il affichera des informations de débogage, donc vous voudrez probablement passer à l'utilisation du paquet oauth pour une vraie application. Au moins cela devrait vous aider à démarrer:

import imaplib 
import random 
import time 

import xoauth 

MY_EMAIL = '[email protected]' 
MY_TOKEN = # your token 
MY_SECRET = # your secret 

def connect(): 
    nonce = str(random.randrange(2**64 - 1)) 
    timestamp = str(int(time.time())) 

    consumer = xoauth.OAuthEntity('anonymous', 'anonymous') 
    access = xoauth.OAuthEntity(MY_TOKEN, MY_SECRET) 
    token = xoauth.GenerateXOauthString(
     consumer, access, MY_EMAIL, 'imap', MY_EMAIL, nonce, timestamp) 

    imap_conn = imaplib.IMAP4_SSL('imap.googlemail.com') 
    imap_conn.authenticate('XOAUTH', lambda x: token) 
    imap_conn.select('INBOX') 

    return imap_conn 

connect() 
+0

Cela fonctionne bien, merci. Comment le ferais-je avec le paquet oauth? – HankSmackHood

+0

Vous pouvez continuer à utiliser xoauth tel quel si vous pouvez tolérer les instructions d'impression ou simplement les extraire de votre copie locale. Je n'ai pas personnellement utilisé oauth mais j'imagine que l'API est similaire. Il y a un exemple dans le dépôt oauth: [exemple client oauth] (http://oauth.googlecode.com/svn/code/python/oauth/example/client.py) – samplebias

3

Google a un bon exemple de code à faire OAuth2 and IMAP. Assurez-vous également que votre portée est correcte.

'scope': 'https://mail.google.com/' 
'access_type': 'offline' 

est Ci-dessous à partir de l'exemple de code dans l'exemple google

import base64 
import imaplib 

my_email = "[email protected]" 
access_token = "" #Oauth2 access token 

auth_string = GenerateOAuth2String(my_email, access_token, base64_encode=False) 
TestImapAuthentication(my_email, auth_string) 


def TestImapAuthentication(user, auth_string): 
    """Authenticates to IMAP with the given auth_string. 

    Prints a debug trace of the attempted IMAP connection. 

    Args: 
    user: The Gmail username (full email address) 
    auth_string: A valid OAuth2 string, as returned by GenerateOAuth2String. 
     Must not be base64-encoded, since imaplib does its own base64-encoding. 
    """ 
    print 
    imap_conn = imaplib.IMAP4_SSL('imap.gmail.com') 
    imap_conn.debug = 4 
    imap_conn.authenticate('XOAUTH2', lambda x: auth_string) 
    imap_conn.select('INBOX') 


def GenerateOAuth2String(username, access_token, base64_encode=True): 
    """Generates an IMAP OAuth2 authentication string. 

    See https://developers.google.com/google-apps/gmail/oauth2_overview 

    Args: 
    username: the username (email address) of the account to authenticate 
    access_token: An OAuth2 access token. 
    base64_encode: Whether to base64-encode the output. 

    Returns: 
    The SASL argument for the OAuth2 mechanism. 
    """ 
    auth_string = 'user=%s\1auth=Bearer %s\1\1' % (username, access_token) 
    if base64_encode: 
    auth_string = base64.b64encode(auth_string) 
    return auth_string 
+0

Google fournit des exemples OAuth 1 & 2. Leur API OAuth 1 est dépréciée et je ne peux pas l'utiliser avec django-social-auth. Le ci-dessus qui est OAuth 2 fonctionne très bien avec django-social-auth. –