Làm thế nào tôi có thể tạo một nút thông qua cuộc gọi ajax?


7

Tôi có một trang web trong đó một biểu mẫu tùy chỉnh được mở theo phương thức và khi được gửi sẽ gọi hàm ajax đến POST cho dịch vụ REST để tạo nút.

Vấn đề là tôi tiếp tục nhận được phản hồi "Cấm" khi nộp.

Tôi chỉ muốn người dùng đã đăng nhập có thể gửi các yêu cầu ajax này và auth phải là mã thông báo khác nhau cho mỗi người dùng.

Đây là mã của tôi:

$('#create-node-submit').click(function(e) {
    e.preventDefault();
    var newNode = {
        _links: {
            type: {
                href: 'http://mysite.dev/rest/type/node/article'
            }
        },
        type: {
            target_id: 'article'
        },
        title: {
            value: 'This is a test Article from REST'
        },
        field_description: {
            value: 'Here is some test description.'
        }
    };
    getCsrfToken(function (csrfToken) {
        postNode(csrfToken, newNode);
    });

    return false;
});

function getCsrfToken(callback) {
    $.get(Drupal.url('rest/session/token'))
        .done(function (data) {
            var csrfToken = data;
            callback(csrfToken);
        });
}

function postNode(csrfToken, node) {
    $.ajax({
        url: 'http://mysite.devdev/entity/node?_format=hal_json',
        method: 'POST',
        headers: {
            'Content-Type': 'application/hal+json',
            'X-CSRF-Token': csrfToken
        },
        data: JSON.stringify(node),
        success: function (node) {
            console.log(node);
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            console.log("Status: " + textStatus);
            console.log("Error: " + errorThrown);
        }
    });
}

Khi chạy thử nghiệm trong POSTMAN, nó thành công, nhưng xác thực hơi khác ở đó: nhập mô tả hình ảnh ở đây

Như bạn có thể thấy trong hình, tôi nhận được 201 được tạo khi sử dụng POSTMAN.

Tôi tin rằng nó có liên quan đến mã thông báo CSRF đang được sử dụng trong triển khai Javascript. Tôi không chắc chắn nên sử dụng phương thức xác thực nào khi đăng lên cùng một trang thông qua JS.

Tôi đã sử dụng thông tin ở đây .

Tôi đã tạo một báo cáo lỗi vì có vẻ như kiểm tra mã thông báo CSRF đã vượt qua thành công và cấp quyền truy cập, nhưng quyền truy cập bị từ chối từ một nơi khác. Vấn đề # 2831251 Cố gắng tạo các nút thông qua REST với yêu cầu POST ajax trả về 403 phản hồi

Câu trả lời:


2

Bạn có thể sử dụng Postman , một ứng dụng trình duyệt Google Chrome cho phép bạn POST, GET, PATCH và DELETE đến bất kỳ trang web nào (cho mục đích thử nghiệm), để tạo mã cho bạn:

nhập mô tả hình ảnh ở đây

Sau khi hoàn thành 3 bước được hiển thị trong hình, bạn cần thực hiện thêm 1 bước:

  1. Sau đó dán mã vào mô-đun tùy chỉnh của bạn.

PS: Tôi tin rằng bạn có thể xóa postman-tokendòng trong headers.


Điều đó thật tuyệt vời, nhưng tôi không muốn mọi người có quyền truy cập vào mã xác thực "Cơ bản" đó, được tạo bởi thông tin đăng nhập của quản trị viên. Nó nên được tạo cho mỗi người dùng và hoàn toàn không dành cho người dùng ẩn danh.
CR47

@ CR47 Tôi không nghĩ rằng, bạn có thể trích xuất dữ liệu cho auth cơ bản khi đã đăng nhập. Có vẻ như bạn sẽ cần sử dụng phương thức xác thực khác, như xác thực cookie hoặc xác thực tùy chỉnh của riêng bạn
Juraj Nemec

@JurajNemec Cookie được gửi theo mặc định với yêu cầu ajax. Tôi cũng thu hẹp vấn đề với những gì có lẽ là một lỗi trong lõi. Kiểm tra mã thông báo CSRF thực sự vượt qua và có một lỗi xảy ra ở một nơi khác trong chuỗi mà tôi không thể tìm thấy cho đến nay. Tôi đã cập nhật câu hỏi với một liên kết đến báo cáo lỗi trên drupal.org.
CR47

Chưa bao giờ nghe về người đưa thư này , hè "luôn gọi hai lần" (như trong phim)? Bạn có phiền thêm một số chi tiết về nó để giải thích / giới thiệu nó một chút không? Tái
bút

1
Việc tôi đề cập đến yêu cầu POSTman thành công là một thử nghiệm để xem liệu điểm cuối có thực sự hoạt động hay không. Vấn đề là xác thực như được mô tả trong câu hỏi. Gửi tên người dùng / mật khẩu quản trị viên băm trong mọi yêu cầu cho tất cả người dùng không phải là một tùy chọn trong trường hợp này, vì vậy câu trả lời này không thực sự giúp giải quyết vấn đề trong tay. Tôi đã thêm một liên kết đến vấn đề trên drupal.org cho câu hỏi giúp giải thích thêm.
CR47

2

Sự cố là do lỗi trong mô-đun Rest UI v.1.13 cho D8.

Khi viết bài này, vấn đề không được giải quyết trên mô-đun, nhưng có một cách giải quyết.

Để giải quyết vấn đề, các cấu hình được xuất từ ​​Rest UI cần được điều chỉnh trong phần "xác thực".

Xem tại đây để biết thêm: https://www.drupal.org/node/2831716#comment-11813802

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.