Ошибка использования Google API и OAUTH2 в Python для получения информации о пользователе - PullRequest
0 голосов
/ 03 июня 2019

Мое веб-приложение успешно выполняет рекомендуемый Google поток, чтобы получить учетные данные для запроса Google Drive API.Это отлично работает.Однако, когда я пытаюсь использовать те же учетные данные, которые уже получены, для получения электронной почты и имени пользователя, я получаю сообщение об ошибке.

Здесь я получаю учетные данные и запрашиваю Google Drive API.Это прекрасно работает

def analyze():
 credentials = getCredentials() 
 drive_service = googleapiclient.discovery.build('drive', 'v3', credentials=credentials)
 theFiles = drive_service.files().list(pageSize=1000,q="trashed=false", fields="files(id,name,modifiedTime, size)").execute() #THIS WORKS

Сразу после этого я пытаюсь использовать ЖЕ ПОЛНОМОЧИЯ для получения информации о пользователе, но теперь это не работает

oauth2_client = googleapiclient.discovery.build('oauth2','v2',credentials=credentials)
 user_info= oauth2_client.userinfo().get().execute() #THIS FAILS
givenName = user_info['given_name']

Ошибка: https://www.googleapis.com/oauth2/v2/userinfo?alt=json возвращено "В запросе отсутствуют необходимые учетные данные для аутентификации. Ожидаемый токен доступа OAuth 2, cookie для входа в систему или другие действительные учетные данные для аутентификации. См. https://developers.google.com/identity/sign-in/web/devconsole-project.">

НЕКОТОРЫЕ ДРУГИЕ ВАЖНЫЕ ФУНКЦИИ:

def getCredentials():
 *Loads credentials from the session.*
 sc = session['credentials'] 
 credentials = google.oauth2.credentials.Credentials(token=sc.get('token'),
 client_id=sc.get('client_id'),
 refresh_token=sc.get('refresh_token'),
 token_uri=sc.get('token_uri'),
 client_secret=sc.get('client_secret'),
 scopes=sc.get('scopes'))

учетные данные получены на странице обратного вызова:

@app.route('/OAcallback')
def OAcallback():
   flow =google_auth_oauthlib.flow.Flow.from_client_secrets_file('client_id.json', scopes=['https://www.googleapis.com/auth/drive https://www.googleapis.com/auth/userinfo.profile'])
  flow.redirect_uri = return_uri
  authorization_response = request.url
  flow.fetch_token(authorization_response=authorization_response)
  credentials = flow.credentials 
  * Store the credentials in the session.*
  credentials_to_dict(credentials)

Пожалуйста, помогите мне понять, почему мои учетные данные не работают при попытке получитьИнформация о пользователе. Что я должен изменить?

Заранее спасибо !!!

1 Ответ

0 голосов
/ 03 июня 2019

Вы запрашиваете только область профиля.Чтобы также запросить адрес электронной почты, добавьте область действия email.

Измените эту часть своего кода с:

scopes=['https://www.googleapis.com/auth/drive https://www.googleapis.com/auth/userinfo.profile']

на:

scopes=['https://www.googleapis.com/auth/drive https://www.googleapis.com/auth/userinfo.profile' 'email']
...