2016-10-21 4 views
3

Я пишу настольное приложение в Delphi и пытаюсь синхронизировать его с календарем Google (только окна, выигрыш 7 и новее). Я зарегистрировал собственную схему uri в своем системном реестре, поэтому eu.myapp:test запустит мою программу или передаст сообщение уже запущенному экземпляру программы.Настольное приложение с пользовательской схемой uri, «Отсутствующая схема» на запрос токена

Мне удалось пройти первый этап аутентификации - я открываю браузер по умолчанию, запрашивая у пользователя разрешение на изменение своих календарей, я возвращаю код аутентификации обратно в свое программное обеспечение без заминки. Клиент OAuth зарегистрирован как приложение IOS,

Однако, когда я пытаюсь запросить фактический маркер, запрос будет отклонен (400 - Bad Request) со следующим телом ответа:

{ 
    "error": "invalid_request", 
    "error_description": "Invalid parameter value for redirect_uri: Missing scheme: eu.myapp", 
    "error_uri": "" 
} 

Мой запрос тела выглядит следующим образом:

POST /oauth2/v4/token HTTP/1.1 
Host: www.googleapis.com 
Content-Type: application/x-www-form-urlencoded 

code=XXX& 
client_id=YYY& 
redirect_uri=eu.myapp& 
grant_type=authorization_code 

Согласно documentation, я должен включать переадресацию URI, полученный из API консоли, но я не нашел такого URI там. Нашли несколько более старых ответов, но консоль разработчика, видимо, была изменена с тех пор, как они были предоставлены, поэтому они больше не актуальны. Что мне не хватает?

Edit: Добавлено больше информации Я создал сервер просто nodejs и поставить его с сертификатом SSL и Nginx, так что я мог видеть, что на самом деле отправляется в поперечнике. Затем я использовал как приложение, так и пример приложения C#, чтобы отправить ему запрос маркера и контролировать тело запроса. Единственная заметная разница заключалась в том, что delphi url автоматически кодировал код (4% 2Fhky ... вместо 4/Fhky ... например). Кроме того, они казались одинаковыми.

Я также попробовал переписать приложение, чтобы прослушать локальный порт, но в итоге получил те же результаты. Существует демонстрация delphi, где они демонстрируют использование google api, используя встроенный браузер для входа пользователя (и он работает), но, согласно документации api, он устарел и скоро исчезнет. Кроме того, похоже, что я могу управлять первой переадресацией только штрафом, но получение фактических токенов терпит неудачу.

+0

Если его настольным приложением вы, вероятно, должны просто использовать собственные учетные данные или другое. Не iOS. то вы можете просто отправить urn: ietf: wg: oauth: 2.0: oob как ваш URI перенаправления. Это в основном просто означает localhost. – DaImTo

+0

Это рекомендуемый подход Google для настольных приложений - loopback ip или настраиваемая схема URI, и на самом деле он говорит, что вы должны выбрать iOS как тип Client при использовании подхода схемы на рабочем столе. Попытка получить образец C# для работы на данный момент, следуя их [demo] (https://github.com/googlesamples/oauth-apps-for-windows/tree/master/OAuthUniversalApp) – Oxudes

+0

https://developers.google .com/youtube/analytics/registering_an_application Установленное приложение запускается на настольном компьютере или карманном устройстве. Вы можете создать учетные данные OAuth 2.0 для Android, Chrome, iOS и других установленных приложений. Лично я предпочитаю тип другой. Попробуйте связаться с автором демоверсии, чтобы они были рады помочь. Я не видел этого раньше, поэтому, вероятно, не будет большой помощью.Кажется, не использует клиентскую библиотеку Google .Net для C#. Поэтому мои образцы тоже не помогут. Удачи – DaImTo

ответ

0

Обнаружили ошибку. Я заметил, что параметры автоматически кодировались компонентом delphi, ответственным за выполнение запросов. Я вручную закодировал urid перенаправления, прежде чем устанавливать его в качестве параметра в запросе маркера. Затем компонент закодировал его снова, что заставило его отличаться от url, указанного в запросе кода, что вызвало ошибку uri_mismatch.

Урс также должен быть идентичным по обоим запросам, так как даже если второй запрос не перенаправлен, он по-прежнему использует redirect_uri в качестве параметра проверки.

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

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