DocuSign API - как получить ответ обратного вызова после аутентификации пользователя?

Я пытаюсь реализовать API неявного предоставления REST для DocuSign < / а>. Я не понимаю, что должно произойти сразу после входа пользователя в систему. Это автономное собственное настольное приложение Windows, а не веб-служба или страница.

Мне удалось открыть встроенное окно браузера, перейти к правильному URI для входа в систему, и пользователь может успешно войти в систему. У меня также есть HTTP-сервер, работающий в этом приложении, который должен получать обратный вызов. На самом деле обратный вызов действительно работает, я получаю входящую команду HTTP GET. Однако в этом ответе обратного вызова нет ничего полезного. Никаких особых заголовков, параметров, тела, ничего.

Прежде чем я попробовал API неявных грантов, я сначала попробовал метод JWT Grant, прежде чем понял, что это неправильный подход. Но я хочу сказать, что по крайней мере у меня был параметр code в команде обратного вызова. Но после перехода на использование метода неявного предоставления этот ответ пуст.

Согласно документации:

После предоставления согласия служба аутентификации проверяет, действительно ли клиентское приложение имеет доступ к запрошенной области. Если это так, он перенаправляет токен доступа на предоставленный URI обратного вызова в хеш-фрагменте.

Ответ содержит следующие параметры хеш-фрагмента:

.......

Он даже показывает пример ответа:

http://localhost/#access_token=eyJ0eXAi.....9LyiFrUqvdw&expires_in=28800&token_type=bearer&state=a39fh23hnf23

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

Что мне здесь не хватает? Каков правильный подход для завершения процесса аутентификации и перехода к фактическому использованию API?

ПРИМЕЧАНИЕ. Я использую Delphi, поэтому ни один из примеров, предоставленных DocuSign, не совместим.


person Jerry Dodge    schedule 18.02.2020    source источник
comment
Смотрите мой обновленный ответ   -  person Larry K    schedule 19.02.2020


Ответы (3)


Обновленный ответ Используйте Implict Grant, если у вас нет внутреннего сервера в процессе аутентификации. Неявное предоставление предоставляется в любое время, когда секретный ключ идентификатора клиента / закрытый ключ RSA не может быть защищен - в любое время, когда в архитектуре приложения нет защищенного сервера. Сюда входят мобильные приложения (поскольку приложение может быть реконструировано), одностраничные приложения (React, Angular и т. Д.) И настольные / толстые клиентские приложения (например, приложения Delphi).

Я использую Implicit Grant для своих приложений DocuSign, которые я пишу на React.

В вашем случае вы пишете «толстое клиентское приложение», которое полностью работает на рабочем столе.

Поскольку поток неявных грантов OAuth2 DocuSign соответствует стандарту, хорошее место для начала - это примеры фреймворка для аутентификации с другими поставщиками удостоверений OAuth2.

Для Delphi см. их пример для доступа к Facebook API < / а>. Хотя это не совсем то же самое, что и поток неявных грантов DocuSign, он достаточно близок. В частности, обратите внимание, как Facebook также возвращает токен доступа во фрагменте URL-адреса, когда запрашивается response_type=token (как это сделано в примере Delphi).

Цитата из документов по аутентификации Facebook:

response_type = токен. Данные ответа включены в виде фрагмента URL-адреса и содержат токен доступа. Приложения для ПК должны использовать этот параметр для response_type. Это наиболее полезно, когда клиент будет обрабатывать токен.

[Курсив добавлен]

Итог: используйте / измените пример аутентификации Delphi с помощью Facebook, поскольку DocuSign аналогичен. Если вы не можете заставить его работать, обратитесь за помощью в службу поддержки клиентов Delphi, сославшись на пример аутентификации Facebook.

PS После того, как вы решите проблему, предоставьте свой собственный ответ, включающий код, который вы используете, - чтобы помочь другим в будущем. Спасибо!

person Larry K    schedule 19.02.2020
comment
Спасибо, я только сейчас понял, в чем дело. Хотя я предоставляю URI обратного вызова, который фактически запускает мой HTTP-сервер, он не включает параметр access_token или какие-либо параметры. НО, встроенный браузер сразу после входа пользователя ДЕЙСТВИТЕЛЬНО переходит к моему URI перенаправления вместе с необходимыми параметрами. Это действительно сбивает с толку, что callback uri и redirect uri - это одно и то же. - person Jerry Dodge; 19.02.2020
comment
Написал ответ. - person Jerry Dodge; 19.02.2020

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

Однако то, что мне на самом деле нужно сделать, - это не захватывать запрос на HTTP-сервере, а скорее улавливать URI, по которому встроенный браузер переходит после аутентификации пользователя. После успешного входа в систему я попытался ввести URI этого браузера, и теперь я действительно вижу access_token.

Итак, callback uri и redirect uri - это одно и то же, но их можно легко неверно истолковать. У меня есть два разных определения их, где обратный вызов должен отвечать исходному вызывающему абоненту, а перенаправление означает автоматический переход с одной страницы на другую.

Теперь мне любопытно, нужен ли мне HTTP-сервер, или я мог бы просто вслепую бросить любой произвольный URI перенаправления (конечно, зарегистрированный в учетной записи) и просто получить URI после того, как встроенный браузер переместится.

Я не понимаю, почему мой HTTP-сервер не видел эти данные, а встроенный браузер видел. Он должен совпадать с обеих сторон.

Для справки: я использую встроенный браузер Chromium (DCEF3), а HTTP-сервер - это TIdHTTPServer компонент Indy.


ОБНОВЛЕНИЕ

Как отмечено в комментариях, HTTP-сервер не получает часть URI «закладка» по дизайну, потому что закладка - это только на стороне клиента. Нет вообще никаких причин, по которым его нужно отправлять на сервер. Отсюда и уровень безопасности - поскольку эта информация будет использоваться ТОЛЬКО клиентом, а не сервером, было бы рискованно отправлять access_token на сервер через Интернет. Таким образом, он остается локальным для клиентского браузера. Вот почему я видел эти данные в браузере, а не в обработчике запросов HTTP-сервера.

person Jerry Dodge    schedule 19.02.2020
comment
Я не думаю, что вам нужен сервер. Вам просто нужно управлять своим браузером. Он получает обратно токен доступа в ответе в разделе фрагмента URL-адреса. Хитрость в том, что вам нужно поймать этот url / uri, как вы это делаете. Хорошая работа! - person Larry K; 20.02.2020
comment
@LarryK Я готов поспорить, что компонент HTTP-сервера, который я использую (Indy для Delphi), каким-то образом игнорирует закладку в URI, поскольку закладка обычно используется только на стороне клиента - я не могу представить, что реально- case ситуации, почему закладка может понадобиться серверу. Таким образом, скорее всего, закладка отброшена сервером, поэтому HTTP-запрос был пустым, и ничего нельзя было использовать. Мне кажется несколько странным, почему механизм помещает это в закладку, а не в параметры. - person Jerry Dodge; 20.02.2020
comment
@LarryK Я добавил тег indy, надеясь, что другой разработчик Indy Реми может вмешаться и сообщить некоторую дополнительную информацию по этому поводу. Потому что, когда этот HTTP-сервер получает запрос, в информации запроса есть все, кроме информации о закладках, а при наблюдении за необработанной HTTP-командой он показывает URI, включая параметры, но без строки закладки. - person Jerry Dodge; 20.02.2020
comment
Закладки сами по себе не являются частью URL-адресов, поэтому ни один клиент не должен запрашивать закладку. Дело не в том, что сервер отбрасывает закладки, а в том, что сервер вообще не должен получать закладки. - person Remy Lebeau; 20.02.2020
comment
@RemyLebeau Спасибо за это разъяснение. В конце концов, мне даже не нужен HTTP-сервер - пока у меня есть законный URL-адрес, на который я могу настроить перенаправление, я могу получить этот URL-адрес из встроенного браузера Chromium и использовать его, который у меня есть. уже реализовано и пока успешно. - person Jerry Dodge; 20.02.2020
comment
Вам даже не нужен законный URL-адрес, просто что-то уникальное, что вы можете искать, когда сервер сообщает браузеру о перенаправлении на него (и, конечно же, вам нужно будет заблокировать браузер от фактического запроса, поскольку он не делает этого) т действительно существует). - person Remy Lebeau; 20.02.2020
comment
@RemyLebeau Верно, хорошее замечание. Я мог бы просто указать на http://localhost/ и уловить это, когда браузер попытается перейти к нему. Даже не подумал так рано снимать. Спасибо за подсказку. Хотя мне также интересно, проверяет ли DocuSign правильность URL-адреса обратного вызова, поскольку он должен быть предварительно зарегистрирован в учетной записи. Тем не менее, я тестировал настоящий действующий HTTP-сервер LocalHost, и это, похоже, не заботило, пока URL-адрес перенаправления совпадал как в запросе, так и в конфигурации. - person Jerry Dodge; 20.02.2020
comment
Если подумать, из соображений безопасности эти данные, вероятно, были помещены в закладку с единственной целью: они не должны поступать на сервер. - person Jerry Dodge; 20.02.2020
comment
Реми прав в том, что закладка (фрагмент) по спецификации не отправляется на серверы. Джерри, вы также правы в том, что Implicit Grant помещает токен доступа во фрагмент, поскольку он нужен только клиенту (браузеру), и цель состоит в том, чтобы минимизировать его потенциальную утечку. - person Larry K; 20.02.2020

Неявное предоставление в основном предназначено для мобильных приложений, для настольных приложений вам необходимо использовать Предоставление кода авторизации, при таком подходе вы получите код обратно в RedirectUrl. Также обратите внимание на то, чтобы выбрать опцию Authorization Code Grant радио в вашей конфигурации ключа интегратора.

введите здесь описание изображения

person Amit K Bist    schedule 18.02.2020
comment
В документации действительно подчеркивается, что метод предоставления кода авторизации предназначен для серверных / клиентских веб-приложений, что не является тем, чем я занимаюсь. Вы уверены, что это правильное решение для настольных приложений? - person Jerry Dodge; 19.02.2020
comment
Я думал, что настольное приложение означает WebApp (на основе браузера), так что у вас есть автономное приложение? Потому что для предоставления кода авторизации требуется приложение на основе браузера на вашей стороне, чтобы читать код. Если у вас нет приложения на основе браузера для чтения кода из URL-адреса, и если вам нужно получить только одноразовое согласие, лучше всего пойти с согласием JWT, где он попросит конечного пользователя дать одноразовое согласие, а когда согласие будет учитывая, что ваше приложение может сгенерировать токен доступа для этого пользователя. - person Amit K Bist; 19.02.2020
comment
Да, отдельное приложение для Windows. У него есть встроенный браузер для входа в систему и возможности HTTP, но при попытке JWT это было еще более сложным и сложным, особенно когда дело доходит до фактического создания JWT. Я выбрал более простой метод, хотя и не такой безопасный, потому что это будет небольшое внутреннее приложение компании, использующее его. - person Jerry Dodge; 19.02.2020
comment
Существует множество библиотек, которые могут помочь вам в создании JWT. Ознакомьтесь с библиотеками на разных языках на веб-сайте jwt.io. - person Amit K Bist; 19.02.2020
comment
Привет, Амит! Неявное предоставление предоставляется в любое время, когда секретный ключ идентификатора клиента / закрытый ключ RSA не может быть защищен - в любое время, когда в архитектуре приложения нет безопасного сервера. Сюда входят мобильные приложения (поскольку приложение может быть реконструировано), одностраничные приложения (React, Angular и т. Д.) И приложения толстого клиента (например, приложения Delphi). - person Larry K; 19.02.2020