Yêu cầu REST được xác thực trở thành người dùng ẩn danh


7

Tôi mới sử dụng các mô-đun dịch vụ và rest_server (và API RESTful hoàn toàn.) Theo tôi hiểu, các bước cơ bản là thế này:

  1. Gửi yêu cầu bài đăng tới / api / user / đăng nhập với tên người dùng và mật khẩu được đặt trong dữ liệu
  2. Lưu trữ mã thông báo bạn nhận được trong phản hồi
  3. Trong các yêu cầu bài đăng tiếp theo, hãy thêm mã thông báo vào tiêu đề bằng khóa X-CSRF-TOKEN

Khi tôi sử dụng tiện ích mở rộng Chrome Postman để làm điều đó, nó hoạt động rất tốt. Khi tôi thực hiện mã, mã api / user / đăng nhập vẫn ổn, tôi nhận được mã thông báo, nhưng khi tôi cố gắng truy cập / api / other / endpoint, tôi nhận được 403 Access bị từ chối vì lỗi ẩn danh của người dùng.

Yêu cầu đầu tiên (/ người dùng / đăng nhập) trông như thế này:

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"}

Và yêu cầu thứ hai (/ other / endpoint) trông như thế này:

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

Nếu tôi thực hiện yêu cầu / người dùng / mã thông báo sau khi xác thực, tôi sẽ nhận được mã thông báo mới mỗi lần. Nếu tôi cố gắng đăng xuất ngay lập tức sau khi đăng nhập (và gửi mã thông báo đó), tôi nhận được "406 Không thể chấp nhận: Người dùng chưa đăng nhập." lỗi. Nó cho tôi biết người dùng chưa đăng nhập.

Nếu tôi kiểm tra trang web, nó cho thấy người dùng đã đăng nhập thành công và vẫn đăng nhập sau khi thực tế.

Tôi có phải lưu / gửi bất cứ điều gì liên quan đến tên phiên / id hoặc cookie không? Mọi thứ tôi đang xem chỉ đề xuất mã thông báo phiên là cần thiết.


Bạn đã kích hoạt Session authenticationdưới admin/structure/services/list/[my-endpoint]và xóa tất cả bộ nhớ cache?
tyler.frankenstein

Vâng và vâng. Tôi không nghĩ rằng nó sẽ hoạt động trong Postman nếu tôi chưa kích hoạt xác thực phiên.
Bất ổn Xu hướng

Ok, tôi chỉ có kinh nghiệm trong trình duyệt, nơi cookie được chăm sóc tự động. Vì vậy, tôi nghĩ rằng bạn cũng cần gửi cùng id phiên trong tiêu đề nếu bạn thực hiện cuộc gọi từ môi trường không phải là JS (ví dụ: PHP). Bạn đang sử dụng mã nào để thực hiện cuộc gọi?
tyler.frankenstein

Hoàn toàn là PHP. Nếu tôi cần thêm id phiên, tôi có thêm nó vào Tiêu đề không? Và cái gì sẽ là chìa khóa; Phiên / sessionid / session-id / vv? Tôi đã thử bất kỳ sự kết hợp nào tôi có thể nghĩ ra với cùng kết quả.
Bất ổn Xu hướng

Câu trả lời:


2

(Trả lời câu hỏi của riêng tôi và cố gắng nói giống như bên thứ ba để nó có ý nghĩa hơn khi đọc ...)

Có vẻ như nó chắc chắn có liên quan đến phiên / cookie / v.v., vì các cuộc gọi tiếp theo dường như đến từ một máy khách khác (từ quan điểm của máy chủ REST.) Tôi đoán rằng PHP không có cách nào duy trì cookie đó , giống như một trình duyệt sẽ như thế nào. Sau khi xem ở đây , có vẻ như cookie cần được định dạng như vậy trong tiêu đề của yêu cầu:

Cookie: session_name=sessid

(Cookie cũng có thể được truy xuất từ ​​các tiêu đề của phản hồi-> biến set_cookie. Cái sau sẽ bao gồm tất cả thông tin hết hạn / liên kết trong chuỗi. Mặc dù cả hai phương thức đều hoạt động, tôi không chắc có bất kỳ lỗi nào không hiệu ứng từ cái này hay cái khác. Tôi chỉ sử dụng phương pháp đầu tiên vì đó là giải pháp đầu tiên tôi gặp.)

Cả session_name và sessid đều có thể được lấy từ vùng dữ liệu của phản hồi sau khi có yêu cầu đăng nhập / người dùng. Vì vậy, yêu cầu cuối cùng sẽ trông giống như thế này đối với người dùng / đăng xuất

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

Tôi đang đối mặt với một vấn đề tương tự, nhưng tôi đang sử dụng Basic Auth để thử nghiệm. Tôi có thể tạo một nút chỉ tốt ( POST /entity/node...), nhưng các yêu cầu chỉnh sửa tiếp theo ( PATCH /node/123hoặc DELETE /node/123) không thành công với 403. Auth cơ bản được bật cho các tuyến nội dung trong cấu hình REST.
aalaap

0

Có vấn đề tương tự trước đây khi cố gắng đăng nhập hoặc nhận X-CSRF-Token (/ services / session / token) qua api, nó chỉ thay đổi mã thông báo mỗi khi làm mới hoặc theo yêu cầu. Giải pháp của tôi là thiết lập withCredentials thành true trước khi yêu cầu bài viết. Sau khi tôi đặt nó, trang bây giờ có thể đọc cookie phiên

Ví dụ xhr.withCredentials = true;

hoặc trong trường hợp của tôi sử dụng Vue

Vue.http.interceptors.push((request, next) => {
    request.credentials = true;
    next();
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.