Аутентификация Ошибка при подключении к Gmail с помощью imap с использованием маркера oauth

Я пишу скрипт, который использует аутентифицированный логин Google. В настоящее время я получаю токен доступа и адрес электронной почты пользователя и передаю его моей функции, которая подключается к gmail с помощью imap, а затем делает некоторые вещи с письмами. Я генерирую строку auth, как я видел, что другие делают онлайн, но я получаю эту ошибку:

Traceback (most recent call last): File "/Library/Python/2.7/site-packages/flask/app.py", line 2000, in __call__ return self.wsgi_app(environ, start_response) File "/Library/Python/2.7/site-packages/flask/app.py", line 1991, in wsgi_app response = self.make_response(self.handle_exception(e)) File "/Library/Python/2.7/site-packages/flask/app.py", line 1567, in handle_exception reraise(exc_type, exc_value, tb) File "/Library/Python/2.7/site-packages/flask/app.py", line 1988, in wsgi_app response = self.full_dispatch_request() File "/Library/Python/2.7/site-packages/flask/app.py", line 1641, in full_dispatch_request rv = self.handle_user_exception(e) File "/Library/Python/2.7/site-packages/flask/app.py", line 1544, in handle_user_exception reraise(exc_type, exc_value, tb) File "/Library/Python/2.7/site-packages/flask/app.py", line 1639, in full_dispatch_request rv = self.dispatch_request() File "/Library/Python/2.7/site-packages/flask/app.py", line 1625, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args) File "/Users/Harrison/Desktop/Uber/UberStats.py", line 60, in index return Uber_Cost(email_address, access_token) File "/Users/Harrison/Desktop/Uber/UberStats.py", line 103, in Uber_Cost mail.authenticate('XOAUTH2', lambda x: auth_string) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/imaplib.py", line 364, in authenticate raise self.error(dat[-1]) error: [AUTHENTICATIONFAILED] Invalid credentials (Failure) 

Я печатаю код доступа, а также адрес электронной почты, с которым я вхожу, поэтому знаю, что эти значения не являются нулевыми. Я неправильно генерирую строку auth? Я не аутентифицирую с помощью imap правильно?

Вот мой код:

 from flask import Flask, request, url_for, session, redirect, jsonify from flask_oauth import OAuth import json import imaplib import email from bs4 import BeautifulSoup import base64 GOOGLE_CLIENT_ID = '****' GOOGLE_CLIENT_SECRET = '***' REDIRECT_URI = '/authorized' # one of the Redirect URIs from Google APIs console SECRET_KEY = 'Uber' DEBUG = True app = Flask(__name__) app.secret_key = 'Uber' oauth = OAuth() google = oauth.remote_app('google', base_url='https://www.google.com/accounts/', authorize_url='https://accounts.google.com/o/oauth2/auth', request_token_url=None, request_token_params={'scope': 'https://www.googleapis.com/auth/userinfo.email', 'response_type': 'code'}, access_token_url='https://accounts.google.com/o/oauth2/token', access_token_method='POST', access_token_params={'grant_type': 'authorization_code'}, consumer_key=GOOGLE_CLIENT_ID, consumer_secret=GOOGLE_CLIENT_SECRET) @app.route('/') def index(): access_token = session.get('access_token') if access_token is None: return redirect(url_for('login')) access_token = access_token[0] from urllib2 import Request, urlopen, URLError headers = {'Authorization': 'OAuth '+access_token} req = Request('https://www.googleapis.com/oauth2/v1/userinfo', None, headers) try: res = urlopen(req) except URLError, e: if e.code == 401: # Unauthorized - bad token session.pop('access_token', None) return redirect(url_for('login')) return res.read() j = json.loads(res.read()) email_address = j['email'] print email_address, access_token return Uber_Cost(email_address, access_token) @app.route('/login') def login(): callback=url_for('authorized', _external=True) return google.authorize(callback=callback) @app.route(REDIRECT_URI) @google.authorized_handler def authorized(resp): access_token = resp['access_token'] session['access_token'] = access_token, '' return redirect(url_for('index')) @google.tokengetter def get_access_token(): return session.get('access_token') def GenerateOAuth2String(username, access_token, base64_encode=True): auth_string = 'user=%s\1auth=Bearer %s\1\1' % (username, access_token) if base64_encode: auth_string = base64.b64encode(auth_string) return auth_string def Uber_Cost(email_address, access_token): auth_string = GenerateOAuth2String(email_address, access_token, base64_encode=False) mail = imaplib.IMAP4_SSL('imap.gmail.com') mail.debug = 4 mail.authenticate('XOAUTH2', lambda x: auth_string) mail.select('INBOX') 

Похоже, у вас есть метод authenticate (), основанный на вашем последнем коде.

Для проверки подлинности с серверами IMAP и SMTP вам также необходимо https://mail.google.com/ OAuth.

Это добавляет его в ваш запрос области и убедитесь, что ваше приложение настроено для этой области в консоли Google App:

 request_token_params={'scope': 'https://www.googleapis.com/auth/userinfo.email https://mail.google.com/', 'response_type': 'code'}, 

Протокол и области OAUTH2 Google задокументированы на странице своего разработчика .