Аутентифицированные запросы REST становятся анонимными пользователями

Я новичок в модулях services и rest_server (и API RESTful вообще). Однако, насколько я понимаю, шаги в основном таковы:

  1. Отправить запрос на отправку /api /user /login с именем пользователя и паролем, установленными в данных
  2. Сохраните маркер, который вы получите в ответ
  3. В последующих пост-запросах добавьте токен в заголовок с ключом X-CSRF-TOKEN

Когда я использую расширение Postman Chrome для этого, он отлично работает. Когда я делаю это в коде, он делает api /user /login fine, я получаю токен, но когда я пытаюсь получить доступ /api /other /endpoint, я получаю 403 Access denied для анонимной ошибки пользователя.

Первый запрос (/user /login) выглядит следующим образом:

POST /api/user/login HTTP/1.0
Content-Type: application/json
Accept: application/json
User-Agent: Drupal (+http://drupal.org/)
Host: mysiteurl.com
Content-Length: 41

{"username":"NAME","password":"PASSWORD"}

И второй запрос (/other /endpoint) выглядит следующим образом:

POST /api/other/endpoint HTTP/1.0
Content-Type: application/json
Accept: application/json
X-CSRF-TOKEN: vGJm5GNDGumf-SoHnLsBU6d46EkrOZkvUY0CSa08GA0
User-Agent: Drupal (+http://drupal.org/)
Host: mysiteurl.com
Content-Length: 0

Если я выполняю запросы к /user /token после аутентификации, я получаю новые маркеры каждый раз. Если я попытаюсь выйти из системы сразу после входа в систему (и отправить этот токен), я получаю сообщение «406 Not Acceptable: User не вошел в систему». ошибка. он говорит мне, что пользователь не вошел в систему.

Если я проверяю сайт, он показывает, что пользователь успешно зарегистрировался и все еще регистрируется после факта.

Нужно ли мне сохранять /отправлять что-либо в отношении имени /id сеанса или файла cookie? Все, что я искал, требует только токена сеанса.

6 голосов | спросил UnsettlingTrend 15 PMpWed, 15 Apr 2015 23:16:53 +030016Wednesday 2015, 23:16:53

2 ответа


2

(Отвечая на мой собственный вопрос и пытаясь звучать как сторонняя сторона, поэтому это имеет смысл при чтении ...)

Похоже, что это определенно имеет отношение к сеансу /cookie /etc., поскольку последующие вызовы, похоже, поступают от другого клиента (с точки зрения сервера REST.) Я предполагаю, что у открытого PHP нет способа поддерживая этот файл cookie, например, как браузер. После просмотра здесь , похоже, что файл cookie должен быть отформатирован как таковой в заголовке запроса

Cookie: session_name=sessid

(Файл cookie также может быть извлечен из переменной заголовка ответа -> set_cookie, последняя будет включать в себя всю информацию об истечении /ссылке в строке. Хотя любой из методов, похоже, работает, я не уверен, это какие-то побочные эффекты от того или другого. Я просто использовал первый метод, потому что это было первое решение, с которым я столкнулся.)

И имя session_name, и sessid могут быть взяты из области данных ответа после запроса пользователя /входа. Таким образом, запрос в конечном итоге будет выглядеть примерно так для пользователя /выхода из системы

POST /api/user/logout HTTP/1.0
Content-Type: application/json
Accept: application/json
X-CSRF-Token: igHUQD11Y8LYdyzHi8m5t33U_tCVZNHE6BbptE4mrwQ
Cookie: SESSd3a1acd26f95229c67cd0a9a1e455bd4=rv-Kbyb8znaGlYBBU5Dn7M2GzkYdWnun5aXcVYLVfvY
User-Agent: Drupal (+http://drupal.org/)
Host: mysiteurl.com
Content-Length: 0
ответил UnsettlingTrend 17 PMpFri, 17 Apr 2015 20:17:15 +030017Friday 2015, 20:17:15
0

Если при попытке войти в систему или получить X-CSRF-токен (/services /session /token) с помощью api, он просто меняет токен каждый раз после обновления или по запросу. Мое решение состоит в том, чтобы установить withCredentials в true до отправки запроса. После того, как я установил его, страница теперь может читать файл cookie сеанса

Пример xhr.withCredentials = true;

или в моем случае с помощью Vue

Vue.http.interceptors.push((request, next) => {
    request.credentials = true;
    next();
});
ответил Jry 16 PM00000080000001831 2017, 20:24:18

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132