2016-10-15 3 views
3

Я использую oauth 2.0 с гибридным потоком для входа в google https://developers.google.com/identity/sign-in/web/server-side-flow в своем приложении для Android. Я получаю одноразовый код авторизации в приложение для Android и отправляю его в свою флягу api через postman. Когда я применяю flow.step2_exchange к этому однократному коду auth в api, он дает мне ошибка обмена потоком. Я проверил код аутентификации, который поступает в api, так же, как и в моем приложении. Я не могу найти причину ошибки.401 Несанкционированная ошибка. Не удалось обновить код авторизации до объекта учетных данных

Мой один раз код аутентификации выглядит следующим образом: 4/qXilPdy7xOVe5swCBlVRrxjuVu8zEzfcmidlooo7_ls

фрагмент кода моей колба апи:

# IMPORTS FOR THIS STEP 
from oauth2client.client import flow_from_clientsecrets 
from oauth2client.client import FlowExchangeError 
import httplib2 
import json 
from flask import make_response 
import requests 


app = Flask(__name__) 

CLIENT_ID = json.loads(
    open('client_secrets.json', 'r').read())['web']['client_id'] 
APPLICATION_NAME = "OAUTH_SERVER" 
SCOPES = [ 
    'https://www.googleapis.com/auth/gmail.readonly', 
    'https://www.googleapis.com/auth/userinfo.email', 
    'https://www.googleapis.com/auth/userinfo.profile', 
    # Add other requested scopes. 
] 

# Connect to Database and create database session 
engine = create_engine('sqlite:///restaurantmenu.db') 
Base.metadata.bind = engine 

DBSession = sessionmaker(bind=engine) 
session = DBSession() 

@app.route('/gconnect', methods=['POST']) 
def gconnect(): 
    request.get_data() 
    code = request.data.decode('utf-8') 
    print (code) 

    # Upgrade the authorization code into a credentials object 
    oauth_flow = flow_from_clientsecrets('client_secrets.json', scope = SCOPES) 
    oauth_flow.redirect_uri = 'postmessage' 
    try: 
     credentials = oauth_flow.step2_exchange(code) 
     if credentials is None: 
      print ("it is empty") 
    except FlowExchangeError: 
     response = make_response(
      json.dumps('Failed to upgrade the authorization code.'), 401) 
     response.headers['Content-Type'] = 'application/json' 
     return response 

Мой client_secret.json для Апи называется OAUTH_SERVER и следующим образом:

{"web": 
     {"client_id":"matches the one in console.apps.googleusercontent.com", 
"project_id":"oauthapi", 
"auth_uri":"https://accounts.google.com/o/oauth2/auth", 
"token_uri":"https://accounts.google.com/o/oauth2/token", 
"auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs", 
"client_secret":"###########", 
"redirect_uris["http://localhost:5000/gconnect","http://localhost:5000/"], 
"javascript_origins":["http://localhost:5000"]} 
} 

ответ

0

Я думаю, что вам нужно изменить

# Upgrade the authorization code into a credentials object oauth_flow = flow_from_clientsecrets('client_secrets.json', scope = SCOPES) oauth_flow.redirect_uri = 'postmessage' try: credentials = oauth_flow.step2_exchange(code) if credentials is None: print ("it is empty") except FlowExchangeError:

в

try: # Upgrade the authorization code into a credentials object oauth_flow = flow_from_clientsecrets('client_secrets.json', scope='') oauth_flow.redirect_uri = 'postmessage' credentials = oauth_flow.step2_exchange(code) except FlowExchangeError:

+0

Он по-прежнему дает ту же ошибку. Я взял первые две строки из «try», чтобы найти строку кода, дающую ошибку. – Sid

0

Как я вижу это из курса Udacity - Аутентификация & авторизации. Проверьте, содержит ли файл login.html правильное значение data-clientid. У меня была такая же проблема, потому что при копировании забыл изменить ее с моей.

+0

Вы правы, это курс Udacity, но я адаптировал этот код для моего проекта Android. Поэтому у меня нет login.html. Я могу войти в приложение Android успешно, а затем получить один раз auth-код и отправить его в api. Мое приложение и api имеют разные client_secrets (предположительно в случае приложения + api). Клиент_secret.json в моем API имеет тип web (api). Я проверил значение идентификатора клиента. Я также отправляю формат моего client_secret JSON в моем вопросе, если с ним что-то не так. – Sid

+0

Итак, чтобы убедиться, что у вас Android-приложение, являющееся клиентом и сервером флеш-сервера (API). Почему они аутентифицируются отдельно для Google? Я думаю, что мобильное приложение является клиентом, который должен обернуть логику в «login.html», и ваш сервер должен иметь client_secret. В мобильном приложении не должно быть client_secret. – Dimitrov86

+0

В курсе udacity используется один идентификатор клиента, секрет клиента, но я не могу этого сделать в моем случае, потому что приложение для веб-приложений и Android имеет разные google_services json, которые нельзя обменять. А также, чтобы получить одноразовый код auth в приложении Android, я должен предоставить идентификатор клиента бэкэнд-сервера в приложении. Проверьте эту ссылку https://developers.google.com/identity/sign-in/android/backend-auth. – Sid

 Смежные вопросы

  • Нет связанных вопросов^_^