【问题标题】:Graphdb.js Node.js - Node Server Authentication with GraphDBGraphdb.js Node.js - 使用 GraphDB 进行节点服务器身份验证
【发布时间】:2020-04-24 00:14:37
【问题描述】:

我知道 GraphDB 本身提供了几种身份验证方式。假设我锁定了对 GraphDB 服务器的访问,并且只允许具有凭据的用户访问它。假设我使用用户名和密码创建了一个授权用户。

我正在使用 Node.js,尤其是 graphdb.js 来建立不安全的连接。但是如何在节点服务器和 graphdb 服务器的通信之间添加身份验证?文档说:

如果要针对安全服务器使用该库,则所有 API 调用必须通过发送 http 授权进行身份验证 带有令牌的标头,该令牌在调用后获得 rest/login/user_name 带有作为特定标头提供的密码。在 如果服务器要求对请求进行身份验证,则 在 ServerClientConfig 和 RepositoryClientConfig 必须是 配置了要使用的用户名和密码 验证。如果提供了这些,则客户假定 身份验证是强制性的,并且使用提供的登录 在第一次 API 调用之前自动执行凭据。 成功登录后,收到的用户详细信息和身份验证 令牌存储在 AuthenticationService 中。从那一刻起, 每个 API 调用都会发送一个授权标头,其中包含 令牌作为价值。如果令牌过期,那么第一个 API 调用将是 以状态 401 的 http 错误被拒绝。客户端处理此 通过使用相同的凭据重新登录用户自动更新 存储的令牌并重试 API 调用。这种行为是 默认值,如果 ServerClientConfig 或 RepositoryClientConfig 配置为 keepAlive=false。

那么需要遵循的示例代码的编码步骤是什么。我还没有在某处看到这样做的例子。有人可以帮忙吗?

【问题讨论】:

    标签: node.js api authentication graphdb


    【解决方案1】:

    除了@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);
    });
    

    【讨论】:

    • 我刚刚评论了在graphdbjs之外的状态或方法。但我不确定我是否完全理解如何将 curl 命令转换为 node.js 命令
    • 所以在“//使用令牌配置....”里面我应该放一些类似下面的代码并在那里做我想做的事情? 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()
    • 这样做我得到一个错误:(节点:14014)UnhandledPromiseRejectionWarning:错误:请求失败,状态码为401(节点:14014)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。 (拒绝 ID:2)(节点:14014)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。
    • 我使用令牌连接到服务器和存储库,但我不应该在安全开启且免费访问关闭时以某种方式在我想要执行的查询中发送它吗?
    • 嗨@Evan 我对这个话题做了一些调查,这就是我发现的。目前,无法使用某些标头配置 ServerClient 并将它们与请求一起传递。我已经创建了一个关于 here 的问题,我要感谢你指出我的方向:)。现在谈谈你的问题。如果您不需要 ServerClient 来获取 RDFRepositoryClient 实例,那么我建议您直接创建它。
    【解决方案2】:

    启用安全性后,您必须通过传递 JWT 令牌来授权请求​​。 要接收 JWT 令牌,您可以以用户 admin 的身份发送请求。为简单起见,所有示例均使用 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
    

    【讨论】:

    • 我不熟悉如何将 curl 命令转换为 nodejs 命令,尽管我了解您的命令的心态。也许原生 js 代码或 node.js 代码会让我更清楚。我是一个 nodejs 新人,而常见的事情对我来说并不常见
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多