slashDB 通过 POST 请求访问数据库并使用 APIkey 产生 403 错误

slashDB accessing a database via POST request and using APIkey yields 403 error

关于 POST HTTP 方法的安全问题:

我创建了一个名为 "MyAPP" 的用户:

 {
    "userdef": [
        "view",
        "create"
    ],
    "api_key": "dzn8k7hj2sdgddlvymfmefh1k2ddjl05",
    "user_id": "MyAPP",
    "name": "MyAPP",
    "creator": "admin",
    "edit": [],
    "dbdef": [
        "view",
        "create"
    ],
    "querydef": [
        "view",
        "create"
    ],
    "databases": {
        "Gaming": {
            "dbuser": "mydbuser_here",
            "dbpass": "mypass_here"
        }
    },
    "password": 

"$rounds=665736$x/Xp0k6Nj.5qzuM5$G.3w6Py1s.xZ83RHDU55qonNMpJe4Le8nD8PqjYKoOtgbab7T22knJPqwHspoT6BQxp.5gieLFuD0SdD9dyvi/",
        "email": "",
        "view": []
}

然后我想发出 POST 以执行 SQL Pass-thru 例如:

http:///query/InsertBestScore/Score/99/ScreenName/GollyGolly.xml?apikey=dzn8k7hj2sdgddlvymfmefh1k2ddjl05

我在其中构建了一个查询并将其命名为 "InsertBestScore": 插入 Gaming.Leaderboard (屏幕名称,分数) 价值观 (:ScreenName, :Score);

如果我 运行 通过 POSTMAN 使用 POST 方法: ... 然后我获得访问权限,403 :

<?xml version="1.0" encoding="utf-8"?>
<SlashDB>
    <http_code>403</http_code>
    <description>Access was denied to this resource. Please log in with your username/password or resend your request with a valid API key.</description>
    <url_template>/query/InsertBestScore/Score/{Score}/ScreenName/{ScreenName}.xml</url_template>
</SlashDB>

此外,我将从应用程序调用此 POST(或 PUT)请求,在我的例子中是来自 AWS Lambda 函数的 Python 程序 运行ning。

现在,我在文档中看到了这个:

两个参数API键 SlashDB 还允许在此身份验证方法中使用两个参数凭据 - 应用程序 ID 和 api 密钥。这在与 3Scale 等 API 管理系统集成时可能会派上用场。默认情况下 header 和查询字符串参数为:

•   appid - identifies certain application
•   apikey - secret for the application
Request with API key in header - Access granted

...但是在上面的示例中,我没有看到 appid 发挥作用的地方。 你能告诉我如何调用 SlashDB 端点并传递 API 密钥并确保用户 ID 被称为 MyAPP。

因此,总而言之,文档提到: • 另一个应用程序使用API 密钥进行身份验证,该密钥随每个请求一起发送。该应用程序被识别为 SlashDB 用户 App2,它使用数据库登录 db_admin。实际上,此应用程序可以 SELECT、更新、插入和删除数据。

所以我实际上想做的就是那个项目符号中的内容:将我自己标识为用户(而不是 App2,我是用户 MyAPP),然后使用分配的 dbuser 和 dbpass 来访问 "Gaming" 数据库.

想法?

OK,这里真的有两个问题:

  1. 为什么访问被拒绝?
  2. 什么是appid,如何使用。

广告。 1:请求必须清除两个授权障碍。

第一个是 SlashDB 强加的,因为执行查询的用户必须列在查询定义屏幕上的执行字段中。这是在查询中的配置 -> 查询 -> "edit" 按钮下完成的。

第二个障碍是数据库强加的。执行您的 POST 请求的 SlashDB 用户必须映射到对 Gaming.Leaderboard table 具有 INSERT 权限的物理数据库用户。不用说,此数据库用户必须与 table 所在的数据库模式相关联。

广告。 2. 要启用 appid,用户 api 密钥必须由冒号“:”分隔的两部分组成。第一部分将被解释为 appid,第二部分将被解释为 apikey。

为此,请为相关用户使用配置 -> 用户 -> 'edit' 按钮。然后只需在 API 键的开头添加一个冒号,然后在冒号左侧输入您想要的 appid。该应用程序必须提供两个密钥才能执行请求。请注意,这些键的名称(即 appid)可在 /etc/slashdb/slashdb.ini.

中配置

此功能背后的原因是为了方便 API 管理平台,这有助于密钥管理,尤其是当 API 将暴露给第三方开发人员时。

确保您已授予用户 MyAPP 执行查询的权限。 为此:

  • 以管理员身份登录,
  • 转到配置 -> 查询,
  • 打开您的查询定义,
  • 更新字段 Execute。它接受逗号分隔的用户 ID。