2013-12-06 2 views
2

Я пытаюсь реализовать однократный кодовый знак в потоке в моей системе. Приложение содержит две части: 1) Android приложение, которое запрашивает Google+ для одноразового кода авторизации 2) Rails-сервер, который получает одноразовый код из приложения Android в заголовке запроса и пытается обменять код access_token и id_token из Google+Google+ login redirect_uri_mismatch error

Проблема заключается в том, что все работает хорошо, если я получаю одноразовый код с помощью кнопки входа в JavaScript в браузере, но не работает, когда одноразовый код получается приложением Android, а затем отправляется на мой сервер.

Я получаю всегда

"error" : "redirect_uri_mismatch" 

настройки моего сервера следующие:

{ "web": 
{ "client_id": "MY_REGISTERED_WEB_APP_CLIENT_ID", 
    "client_secret": "MY_CLIENT_SECRET", 
    "redirect_uris": ["postmessage"], 
    "auth_uri": "https://accounts.google.com/o/oauth2/auth", 
    "token_uri": "https://accounts.google.com/o/oauth2/token" 
    } 
} 

Теперь, как я запрашивающий одноразовый код из Android приложения: Я использую тот же MY_REGISTERED_WEB_APP_CLIENT_ID как на моем сервере для запроса одноразового кода. Я не знаю, может быть, мне нужно использовать на другом идентификаторе клиента, который соответствует моему Android-приложению? Но все найденные документы и статьи указывают на зарегистрированное веб-приложение client_id.

Или, может быть, мой сервер рельсов должен быть настроен не для Интернета, а для установленного типа зарегистрированных в приложениях Google Консоли?

Сейчас относительно redirect_uris. Я попытался установить несколько redirect_uris в консоли Google:

  • пустое поле
  • http://localhost:5000
  • https://localhost:5000
  • http://my.deployment.url/auth2callback

Веб происхождение в консоли Google устанавливаются - http://my.deployment.url - http://localhost:5000

Не могу понять, что я делаю неправильно. На самом деле я не понимаю, почему мне нужно установить значения redirect_uris, так как я не хочу иметь обратные вызовы от Google, я просто хочу получить access_token и использовать его для доступа к Google+.

+0

ли вы выяснить, в чем проблема? У меня точно такая же проблема. – siyb

+2

@siyb попытается установить 'urn: ietf: wg: oauth: 2.0: oob' как значение параметра redirect_uri. Я сделал это сейчас, и это работает! –

+0

@WalterJr. Спасибо, это похоже на работу;) – siyb

ответ

2

Это происходит из-за того, что redirect_uri, используемое вашим приложением android для создания начального потока входа, отличается от redirect_uri, используемого сервером при попытке изменить код для access_token. Пользователь redirect_uri возвращает пользователя, а redirect_uri, используемый в обмене токена, должен совпадать.

+0

Спасибо, тогда возник еще вопрос: где я могу найти значение redirect_uri в моем приложении для Android? Я не устанавливаю его явно. Я использую поток, как описано здесь: https: // developers.google.com/+/mobile/android/sign-in#server-side_access_for_your_app – TopaZ

+0

Похоже, Google фактически требует, чтобы не было redirect_uri. Посмотрите на [эти документы] (https://developers.google.com/accounts/docs/CrossClientAuth#offlineAccess) и посмотрите, помогают ли они. – abraham

+0

Огромное спасибо @abraham, ты спас меня. Множество других ответов во многих других вопросах, упомянутых с использованием «postmessage», и до этого я ничего не имел, но я использовал загруженный json-файл с консоли разработчика и установил redirectUri. поэтому я остановил использование json-файла и удалил вызовы setRedirectUri, и теперь он работает. – Shurikn

1

Надлежащий redirect_uri в этом случае "urn:ietf:wg:oauth:2.0:oob"

+0

Подробнее о том, почему было бы полезно. – Paddy

+0

Но веб-приложение не поддерживает redirect_uri без схемы http или https, shoud Я заполняю «http: // localhost» в нем? –

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