SurrealDB使用外部JWT令牌时认证失败求助
配置外部JWT令牌认证遇到问题求助
我尝试配置SurrealDB使用外部JWT令牌认证,但多次尝试后始终失败,操作步骤如下:
- 首先在SurrealDB中定义令牌:
DEFINE TOKEN my_token ON DATABASE TYPE HS512 VALUE '1234567890';
- 使用密钥
1234567890生成JWT,最初把NS、DB、TK放在Header中:
{ "alg": "HS512", "typ": "JWT", "NS": "help", "DB": "help", "TK": "my_token" }
注:我也试过把NS、DB、TK放在JWT的Payload部分。
- 在JS客户端通过Bearer授权头发起认证请求:
db.authenticate("eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCIsIk5TIjoiaGVscCIsIkRCIjoiaGVscCIsIlRLIjoibXlfdG9rZW4ifQ.e30.uoJypJ-Y9OrZjQW6WtuZWmFYBEOCHlkutbR6mlEYPCHvb49h9nFiWshKDc464MD3jaBh69T1OLwZ2aUWNujiuw")
但不管是JS客户端还是直接HTTP请求,都返回相同错误:
name: "AuthenticationError" message: "There was a problem with authentication" stack: "AuthenticationError: There was a problem with authentication\n at Surreal.
排查解决建议
- 调整字段位置:SurrealDB要求
NS、DB、TK必须放在JWT的Payload里,Header只保留alg和typ即可。正确的Payload示例:{ "NS": "help", "DB": "help", "TK": "my_token", "exp": 1735689600 // 必须添加过期时间,替换为未来的时间戳 } - 添加过期时间:SurrealDB默认强制要求JWT包含
exp字段,没有的话会直接认证失败。 - 更换密钥长度:HS512算法建议使用至少32字符的密钥,你当前用的10位密钥可能触发安全校验,换成更长的密钥(比如
my_secure_hs512_key_that_is_long_enough)再试。 - 确认资源存在:确保
help命名空间和数据库已经通过CREATE NS help;和CREATE DB help;创建完成,否则令牌关联的资源不存在会导致认证失败。 - 检查连接状态:调用
authenticate前,确认客户端已经成功连接到SurrealDB实例,避免未连接就发起认证请求。
内容的提问来源于stack exchange,提问作者Ashamnx
相关产品推荐
相关产品推荐

