Вопрос

Создание объекта Account через сервис OData

Добрый день Уважаемые!

Есть необходимость через веб приложение посредством протокола OData создавать (обновлять) объекты. Проблема в следующем:

После успешной аутентификации через (Supervisor) http://servername/ServiceModel/AuthService.svc/Login и получения необходимых куки отправляю на

http://servername/0/ServiceModel/EntityDataService.svc/AccountCollection

POST запросом  json объект. В приложении использую Apache-HttpClient/4.5.6.

Ответ сервера

<code>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"/>
<title>403 - Запрещено: Доступ запрещен.</title>
<style type="text/css">
</style>
</head>
<body>
<div id="header"><h1>Ошибка сервера</h1></div>
<div id="content">
 <div class="content-container"><fieldset>
  <h2>403 - запрещено. Доступ запрещен.</h2>
  <h3>Предоставленные учетные данные не дают права на просмотр этого каталога или страницы.</h3>
 </fieldset></div>
</div>
</body>
</html>

</code>

При этом, если отправлять PUT  запрос на обновление существующего объекта - все работает. GET запросы тоже работают корректно.

В чем может быть проблема?

Заранее благодарен.

 

У меня такой же вопрос

13 комментариев

Данил, проверь что в запрос добавления данных добавляется параметр 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 в хэдэр - все получилось.

Войдите или зарегистрируйтесь, чтобы комментировать