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

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

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

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

Ответы [ 2 ]

2 голосов
/ 06 ноября 2019

Помимо того, что сказал @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);
});
1 голос
/ 06 ноября 2019

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

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
...