Graphdb.js Node.js - Аутентификация сервера узла с помощью GraphDB

Я знаю, что сам GraphDB предоставляет несколько способов аутентификации. Допустим, я блокирую доступ к серверу GraphDB и разрешаю доступ к нему только пользователям с учетными данными. Допустим, я создаю авторизованного пользователя с именем пользователя и паролем.

Я использую Node.js и, в частности, graphdb.js, чтобы установить небезопасное соединение. Но как мне добавить аутентификацию между связью с сервером узла и сервером graphdb? В документации сказано:

Если библиотека будет использоваться против защищенного сервера, тогда все вызовы API должны быть аутентифицированы путем отправки HTTP-заголовка авторизации с токеном, который получается после вызова rest / login / user_name с паролем, предоставленным в виде определенного заголовка. Если сервер требует аутентификации запросов, тогда в ServerClientConfig и RepositoryClientConfig должны быть настроены имя пользователя и пароль, которые будут использоваться для аутентификации. Если они предусмотрены, то клиент предполагает, что аутентификация является обязательной, и вход в систему с предоставленными учетными данными выполняется автоматически перед первым вызовом API. После успешного входа в систему полученные данные пользователя и токен аутентификации сохраняются в AuthenticationService. С этого момента при каждом вызове API отправляется также заголовок авторизации с токеном в качестве значения. Если срок действия токена истекает, то первый вызов API будет отклонен с ошибкой http со статусом 401. Клиент обрабатывает это автоматически, повторно входя в систему пользователя с теми же учетными данными, обновляет сохраненный токен и повторяет вызов API. Это поведение используется по умолчанию и может быть изменено, если ServerClientConfig или RepositoryClientConfig настроены с keepAlive = false.

Итак, каковы шаги кодирования с образцом кода, которые необходимо выполнить. Я не видел где-нибудь такого примера. Может кто-нибудь помочь, пожалуйста?


person GGEv    schedule 06.11.2019    source источник


Ответы (2)


Помимо того, что сказал @Konstantin Petrov, я бы также упомянул, что встроенная аутентификация с помощью graphdbjs - это функция, которая все еще находится в разработке. Вы можете следить за PR. Также будут добавлены примеры. До тех пор это можно обойти, выполнив запрос на вход и используя токен авторизации, возвращенный с ответом, для создания экземпляра RDFRepositoryClient, настроенного с заголовком авторизации и токеном. Пример этого приведен ниже.

const {RepositoryClientConfig, RDFRepositoryClient} = require('graphdb').repository;
const {RDFMimeType} = require('graphdb').http;
const {SparqlJsonResultParser} = require('graphdb').parser;
const {GetQueryPayload, QueryType} = require('graphdb').query;
const axios = require('axios');

axios.post('http://localhost:7200/rest/login/admin', null, {
    headers: {
        'X-GraphDB-Password': 'root'
    }
}).then(function(token) {
    const readTimeout = 30000;
    const writeTimeout = 30000;
    const repositoryClientConfig = new RepositoryClientConfig(['http://localhost:7200/repositories/testrepo'], {
        'authorization': token.headers.authorization
    }, '', readTimeout, writeTimeout);
    const repositoryClient = new RDFRepositoryClient(repositoryClientConfig);
    repositoryClient.registerParser(new SparqlJsonResultParser());

    const payload = new GetQueryPayload()
        .setQuery('select * where {?s ?p ?o}')
        .setQueryType(QueryType.SELECT)
        .setResponseType(RDFMimeType.SPARQL_RESULTS_JSON)
        .setLimit(100);
    return repositoryClient.query(payload);
})    
.then(function(stream) {
    // here is the query response stream
})
.catch(function(error) {
    console.log('error', error);
});
person factor5    schedule 06.11.2019
comment
Я просто прокомментировал там статус или способ сделать это за пределами graphdbjs. Но я не уверен, что полностью понимаю, как преобразовать команды curl в команды node.js - person GGEv; 06.11.2019
comment
так что внутри // используйте токен для настройки .... Я должен поместить что-то вроде приведенного ниже кода и сделать там то, что я хочу? router.get ('/ getallids', (req, res) = ›{const repositoryClientConfig = new RepositoryClientConfig (['localhost: 7200 / repositories / V2'], {'Authorization': token}, '', readTimeout, writeTimeout) ; server.getRepository ('V2', repositoryClientConfig) .then (repository = ›{repository.registerParser (new SparqlJsonResultParser ()); const payload = new GetQueryPayload () - person GGEv; 07.11.2019
comment
Я получаю сообщение об ошибке: (узел: 14014) UnhandledPromiseRejectionWarning: Ошибка: запрос завершился неудачно с кодом состояния 401 (узел: 14014) UnhandledPromiseRejectionWarning: необработанное отклонение обещания. Эта ошибка возникла либо из-за вызова асинхронной функции без блока catch, либо из-за отклонения обещания, которое не было обработано с помощью .catch (). (идентификатор отклонения: 2) (узел: 14014) [DEP0018] DeprecationWarning: необработанные отклонения обещаний устарели. В будущем необработанные отклонения обещаний завершат процесс Node.js с ненулевым кодом выхода. - person GGEv; 07.11.2019
comment
Я подключаюсь к серверу и репозиторию с помощью токена, но не следует ли мне как-то отправлять его в запросе, который я хочу выполнить, когда безопасность включена, а свободный доступ отключен? - person GGEv; 07.11.2019
comment
Привет, @Evan, я провел небольшое расследование по этой теме и вот что нашел. В настоящее время невозможно настроить ServerClient с некоторыми заголовками и передать их вместе с запросами. Я создал проблему об этом здесь, и я должен поблагодарить вы за то, что указали мне в этом направлении :). Теперь о твоей проблеме. Если вам не нужен ServerClient ни для чего другого, кроме получения экземпляра RDFRepositoryClient, я предлагаю вам просто создать его напрямую. - person factor5; 07.11.2019
comment
Я думаю, что это могло быть выражение возврата, которого у меня никогда не было, вместо этого я запустил поток внутри. Ваше последнее предложение работает как шарм с включенной безопасностью и отключенным свободным доступом. Спасибо, Свилен (?) - person GGEv; 07.11.2019
comment
и что, если бы я хотел обрабатывать SSL-соединения с помощью axios? Я уже настроил свой экземпляр graphdb - person GGEv; 08.11.2019

Когда безопасность включена, вы должны авторизовать запрос, передав токен JWT. Чтобы получить токен JWT, вы можете отправить запрос как пользователь admin. Во всех примерах для простоты используется завиток, но идея такая же.

POST 'http://localhost:7200/rest/login/admin' -H 'X-GraphDB-Password: root' --compressed

возвращаемый заголовок включает токен JWT:

-H 'Authorization: GDB eyJ1c2VybmFtZSI6ImFkbWluIiwiYXV0aGVudGljYXRlZEF0IjoxNTQwODA1MTQ2MTE2fQ==.K0mo2dSa/Gw+AR995qTrsA1zJGwlfOVEaIokZnhINh0='

Вы можете использовать токен в следующих запросах:

curl 'http://localhost:7200/rest/monitor/query/count' -H 'Authorization: GDB eyJ1c2VybmFtZSI6ImFkbWluIiwiYXV0aGVudGljYXRlZEF0IjoxNTQwODA1MTQ2MTE2fQ==.K0mo2dSa/Gw+AR995qTrsA1zJGwlfOVEaIokZnhINh0=' -H 'X-GraphDB-Repository: news' --compressed
person Konstantin Petrov    schedule 06.11.2019
comment
Я не знаком с тем, как преобразовывать команды curl в команды nodejs, хотя я понимаю менталитет ваших команд. Может быть, нативный код js или код node.js сделает мне это более понятным. Я новичок в nodejs, и обычные вещи для меня не совсем обычны - person GGEv; 06.11.2019