使用令牌 SurrealDB 进行身份验证时出现 IAM 错误

问题描述 投票:0回答:1

我最近添加了

--auth
标志,以使我的 SurrealDB 生产实例按照 文档中的建议做好准备。

这样做后,我的用户将无法再查看他们的数据,因为使用 JWT 令牌进行身份验证时会返回此错误:

{"code":403,"details":"Forbidden","description":"Not allowed to do this.","information":"There was a problem with the database: IAM error: Not enough permissions to perform this action"}

删除

--auth
标志允许进行此身份验证,但这违背了生产就绪建议。

JWT 令牌内容示例

{
  "ns": "Test",
  "db": "Test",
  "sc": "account",
  "tk": "user_tkn",
  "id": "users:test_user",
  "iat": 1703421361,
  "exp": 1703424961
}

索取样品

curl -X POST "https://database.com/sql" \
     -H "Content-Type: text/plain" \
     -H "Accept: application/json" \
     -H "Token: <HS256 TOKEN HERE>" \
     -H "NS: Test" \
     -H "DB: Test" \
     -H "SC: account" \
     -d "SELECT * FROM users:test_user"

出于测试目的,我已将

PERMISSIONS FULL
分配给
users
表。

范围信息

{
    "tokens": {
        "user_tkn": "DEFINE TOKEN user_tkn ON SCOPE account TYPE HS256 VALUE 'example123456'"
    }
}

附加信息

启动命令:

surreal start --auth --deny-guests --no-banner

协议:

HTTPS

SurrealDB版本:

1.0.2 for linux on x86_64

jwt surrealdb
1个回答
0
投票

您是正确的,确实非常建议在生产部署中使用

--auth
参数,并且不一定要删除它来解决您的问题。出现问题的原因是您在
Token
标头中提供令牌,而您应该以 Authorization
 格式在 
Bearer $token
标头
中提供令牌。假设 JWT 正在正确构建和签名,这应该可以解决您的问题。

以下是我将如何重现我所理解的您的预期用例:

    使用
  1. surreal start --auth -u root -p root --deny-guests --no-banner
     启动服务器。请记住更改部署中的根凭据。
  2. 使用
  3. surreal sql -u root -p root
     连接到服务器并运行以下语句:
use ns Test db Test; DEFINE SCOPE account; DEFINE TOKEN user_tkn ON SCOPE account TYPE HS256 VALUE 'example123456'; DEFINE TABLE users PERMISSIONS FULL; -- Remember to properly restrict this. CREATE users:test_user CONTENT {"exists": true};

    使用 HS256 算法创建令牌(例如在
  1. jwt.io 中)并使用 example123456
     作为签名秘密。不要选中对秘密进行编码的框。令牌有效负载应包含以下内容:
{ "ns": "Test", "db": "Test", "sc": "account", "tk": "user_tkn", "id": "users:test_user", "iat": 1703421361, "exp": 1803424961 }

    假设您按照我的描述在本地运行 SurrealDB,然后您可以使用刚刚通过 HTTP 请求生成的令牌执行查询,如通过以下命令生成的令牌:
curl -vvv localhost:8000/sql \ --data "SELECT * from users:test_user" \ -H "Accept: application/json" \ -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJucyI6IlRlc3QiLCJkYiI6IlRlc3QiLCJzYyI6ImFjY291bnQiLCJ0ayI6InVzZXJfdGtuIiwiaWQiOiJ1c2Vyczp0ZXN0X3VzZXIiLCJpYXQiOjE3MDM0MjEzNjEsImV4cCI6MTgwMzQyNDk2MX0.SsuApbUvBxsOvO8T5nvtJ294bsUbdynits77dgiETT8"
按照上述说明操作,您应该得到以下响应:

[{"result":[{"exists":true,"id":"users:test_user"}],"status":"OK","time":"97.48µs"}]
我希望这对您有帮助!如果您需要任何其他帮助,请随时告诉我。

PS:我在 SurrealDB 工作。

© www.soinside.com 2019 - 2024. All rights reserved.