Я пытаюсь разработать двухуровневое веб-приложение с MarkLogic-9, использующее серверы JavaScript и HTTP-серверы на стороне сервера. У меня есть простая страница, которая запрашивает имя пользователя/пароль и отправляет запрос GET через Ajax на сервер приложений (проверка на уровне приложения).
Мой скрипт login.sjs:
//generate object with field names from Request params
var params ={}; //JSON parsed URL parameters
var field_names = xdmp.getRequestFieldNames().toArray();
for(var fname_idx in field_names){
params[field_names[fname_idx]] = String(xdmp.quote(xdmp.getRequestField(String(field_names[fname_idx]))));
}
//get username and password from passed paramters
var username = params.username;
var password = params.password;
var ret = xdmp.login(username,password);
ret;
Затем страница входа в систему переадресовывается на домашнюю страницу, на которой отображается основная информация пользователя. Моя проблема в том, что я не могу понять, как сохранить текущий сеанс пользователя после перенаправления на клиентскую страницу на главную страницу.
Сервер приложений имеет аутентификацию на уровне приложения и пользователь по умолчанию, называемый Login-User, который является пользовательским пользователем, который имеет только привилегии, необходимые для входа в систему (xdmp: login). Сервер приложений размещен на localhost: 8601. Я обнаружил, что когда я запускаю login.sjs прямо из браузера (т.е. Набрав localhost: 8601/login.sjs? Username = test_user & password = test_password), мой браузер получает cookie с sessionID. Однако, когда я запускаю login.sjs через запрос Ajax GET, мой браузер не получает никаких файлов cookie. Я не знаю, если это проблема, но я, хотя это, возможно, стоит упомянуть.
Я все еще новичок MarkLogic, поэтому, возможно, я ошибаюсь. В основном, как я могу продолжить сеанс одного пользователя после перенаправления на новую страницу? Использовать файлы cookie для сохранения sessionID? Должен ли я сохранять имя пользователя и пароль в локальном хранилище и регистрироваться каждый раз, когда сайт вызывает новый.sjs файл?
Для полноты, вот клиентская сторона js, которую я использую, чтобы сделать вызов Ajax для входа в систему. Довольно понятно. Файл login.sjs просто возвращает true/false, если логин был успешным.
function createLoginEar(){
$("#login-button").click(function(event){
var un = $("#username").val();
var pw = $("#password").val();
if(un){
params.username = $("#username").val();
}
if(pw){
params.password = $("#password").val();
}
event.preventDefault(); //prevent form from clearing
console.log("input entered");
$.ajax({
type: "GET",
url: url,
data: params,
success: function(data){
if(data == "true"){
console.log("worked");
window.location.href = "homepage.html";
} else{
invalidLogin();
}
},
error: function(data){
invalidLogin();
}
})
})
}
Проблема в том, что, как только страница перенаправляется на домашнюю страницу.html, похоже, что у пользователя нет входа в систему, и когда homepage.html вызывает любой файл.sjs, пользователь сбрасывает значение по умолчанию, которое является "Логин-Пользователь".
Заранее спасибо.
Проблема заключалась в том, что мой браузер не собирал файлы cookie из логина из-за проблем, которые над моей головой, но я нашел ответ в другом сообщении, так что это может быть дубликат.
Получите и сохраните файл cookie (из Set-Cookie) из ответа AJAX POST.
Мне просто пришлось включить следующую строку в мой запрос ajax:
xhrFields: { withCredentials: true },
Поскольку это вызовет ошибку, если у вас есть подстановочный знак в заголовке Access-Control-Allow-Origin, мне также пришлось изменить эту строку:
xdmp.addResponseHeader('Access-Control-Allow-Origin', '*');
к этому:
xdmp.addResponseHeader('Access-Control-Allow-Origin', 'http://localhost:8010');
И теперь мой браузер собирает файлы cookie.
Я предлагаю вам ознакомиться с главой 15 руководства по безопасности.
Существует пример проверки подлинности на уровне приложений с использованием страниц пользовательского входа.
Наконец, образец входа в систему на основе IP-адресов не то, что вам нужно, но показывает, как использовать xdmp.Login для переключения пользователей от пользователя приложения по умолчанию.
Я думаю, что со всем этим (не так уж и важно) вы сможете пройти через свою настройку и переделать ее.