我最近添加了
--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
您是正确的,确实非常建议在生产部署中使用
--auth
参数,并且不一定要删除它来解决您的问题。出现问题的原因是您在 Token
标头中提供令牌,而您应该以 Authorization
格式在
Bearer $token
标头中提供令牌。假设 JWT 正在正确构建和签名,这应该可以解决您的问题。以下是我将如何重现我所理解的您的预期用例:
surreal start --auth -u root -p root --deny-guests --no-banner
启动服务器。请记住更改部署中的根凭据。
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};
example123456
作为签名秘密。不要选中对秘密进行编码的框。令牌有效负载应包含以下内容:
{
"ns": "Test",
"db": "Test",
"sc": "account",
"tk": "user_tkn",
"id": "users:test_user",
"iat": 1703421361,
"exp": 1803424961
}
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 工作。