Добрый день Уважаемые!
Есть необходимость через веб приложение посредством протокола OData создавать (обновлять) объекты. Проблема в следующем:
После успешной аутентификации через (Supervisor) http://servername/ServiceModel/AuthService.svc/Login и получения необходимых куки отправляю на
http://servername/0/ServiceModel/EntityDataService.svc/AccountCollection
POST запросом json объект. В приложении использую Apache-HttpClient/4.5.6.
Ответ сервера
<code>
403 - Запрещено: Доступ запрещен.
Ошибка сервера
403 - запрещено. Доступ запрещен.
Предоставленные учетные данные не дают права на просмотр этого каталога или страницы.
При этом, если отправлять PUT запрос на обновление существующего объекта - все работает. GET запросы тоже работают корректно.
В чем может быть проблема?
Заранее благодарен.
Нравится
Данил, проверь что в запрос добавления данных добавляется параметр BPMCSRF из запроса авторизации
Также должен быть настроен доступ к объекту для внешних сервисов
Wireshark подтвердил наличие всех необходимых куки. Настроил доступ к объекту для внешних сервисов и проверил доступ к операциям OData. Ничего не помогает.
Создал нового пользователя. Под новым пользователем смог получить (get) данные только после внесения в группу SystemAdministartors. Post запросы - та же ошибка.
Такое может быть, если что-то неправильно в заголовках POST-запроса.
Зверев Александр,
Вручную устанавливаю только:
Content-Type = "application/json"
Accept = "application/json;odata=verbose"
Остальные устанавливаются автоматически при аутентификации. Пробовал двумя способами 1) Apache-HttpClient/4.5.6 и 2) RESTClient браузер Firefox - результат тот же.
Например, не передались обе куки, обычная авторизационная и BPMCSRF.
Зверев Александр,
curl запросы
1) Аутентификация внешних запросов к bpm'online, запись куку в файл
curl -i -X POST -H "Content-Type: application/json" -d "{\"UserName\":\"Supervisor\", \"UserPassword\":\"Secret\"}" -c "D:\cookie.txt" "http://myserver.com/ServiceModel/AuthService.svc/Login"
Успешно.
2) Проверка аутентификации и правильности куки - запрос на изменение колонки Name объекста Account. Используем файл куки созданный предыдущим запросом
curl -i -X PUT -H "Content-Type: application/json;odata=verbose" -H "Accept: application/json;odata=verbose" -d "{\"Name\":\"Our company_test\"}" -b "D:\cookie.txt" -c "D:\cookie.txt" "http://myserver.com/0/ServiceModel/EntityDataService.svc/AccountCollection(guid'E308B781-3C5B-4ECB-89EF-5C1ED4DA488E')"
Успешно.
3) Запрос на создание объекта BankAccount
curl -i -X POST -H "Content-Type: application/json" -H "Accept: application/json;odata=verbose" -b "D:\cookie.txt" -c "D:\cookie.txt" -d "{\"Id\":\"8080EDFF-9858-5D90-E053-2413A8C0E8DE\", \"CreatedOn\":\"Jan 29, 2019 9:50:25 AM\", \"CreatedById\":\"410006E1-CA4E-4502-A9EC-E54D922D2C00\", \"BankAccountNumber\":\"123456\"}" "http://myserver.com/0/ServiceModel/EntityDataService.svc/BankAccountCollection"
Ответ - ошибка 403 из вопроса.
Куки из файла
BPMLOADER acth1svm4chyo1kde1tyhabi
.ASPXAUTH F87665E30ADF2706A530B217A9EEBD49F7970A16EE377079185607C2675CDEE780E8CEF53C210C88579B063BA610E934AA43B9BC9995684C9BE83B3DCF65DEF3F8396A000BAE95E4EAB56B10C83BAEC684CDCA449499B5B98109C4281A07D3AC55DC9CE553850D8C5F0145C2B5E93661FB1DB3CDFDD5390C7B52955F365F0C86FBAE51F5AE6800B74F59DEB8984F38EFB1FB60EE9571CE7BAC926E838E8D3BDA6EB756270AAF1DD747094A62A68EA6B0E300216C474299FBF7BDD2C5AC86CCBC020BE29D480523ECDEE2F7E15A3E46FA7AD588401C8D37CB25E409975C755B63F5FD49989A5EFBBA3DA95590F325876DB911845D2A81DBE30B98A36CC4BEC373DC1C746C7D8EE7AE62658F60FD013C66A5F67023E0FCE30F15296A1686F9A74D01133441519B3EA7A5A3FBD62BBFC757665AE769CF0260E5E20EB963DD3BD3D9EBB47206A9B9B1B44E8D53048EA12B402290512509EC00733232B9DFEBB7DD2D2643E78A
BPMCSRF u2jumlmWDoKSYOpQwfgJjO
UserName 83|117|112|101|114|118|105|115|111|114
BPMSESSIONID 4zcngupbd5iwesppbeux5mrr
Это два разных объекта, Account и BankAccount. Возможно, Вы разрешили всё по одному, а пытаетесь добавлять в другой.
Нет, пример с BankAccount привел из-за соображений компактности. Все
доступы к объектам для внешних сервисов настроены. Пробовал Account, Contract, BankAccount и Activity из примера академии(https://academy.terrasoft.ru/documents/technic-sdk/7-13/vypolnenie-zapr…) Результат тот же.
BPMCSRF нужно передавать не только в куках, а и отдельным заголовком. См. статью по отправке запросов из фиддлера.
Зверев Александр,
Спасибо БОЛЬШОЕ! После добавления BPMCSF в хэдэр - все получилось.