SurrealDB 支持验证三方发布的 JWT 令牌。
复制一份请求,名字改成“定义令牌”,定义的令牌可以选择在几个层级里使用,比如可以用在命名空间,数据库或者作用域。下面我们定义一个可以用在作用域上的令牌。
作用域是在命名空间里的某个数据库里面,所以需要先设置一下要使用的命名空间还有数据库,USE NS ninghao,USE DB xuanwu。
然后用 DEFINE TOKEN 定义令牌,令牌的名字可以随便定义,比如 xuanwu_token ,ON SCOPE authenticated。这个令牌可以用在 ninghao 命名空间下的 xuanwu 这个数据库里,它属于 authenticated 这个作用域。
再用 TYPE 指定一下令牌的加密算法,比如 HS512 ,它是一个对称的加密算法,也就是加密解密使用的同一个密钥。在 VALUE 的后面是解密令牌需要用的密钥,这个密钥尽量复杂一些,为了方便测试,可以先输入几个简单的数字作为令牌的密钥。比如 258369。
如果令牌的 TYPE 是 RS256,这个 VALUE 后面的值就是解密令牌需要用到的公钥内容。
下面执行一下 INFO FOR SCOPE authenticated; 查看一下 authenticated 这个作用域。你会发现在这个作用域里有个 st,表示 Scope Token,它里面的东西就是在这个作用域里定义的令牌。
签发
现在我们可以自己签发一个 JWT 令牌,先打开“测试用户权限”,执行 SELECT * FROM $token,复制一下返回的结果。这个令牌可以是三方机构签发的,也可以是我们自己的应用签发的。
打开 jwt.io 这个网站,在这个网站测试签发一个令牌。先把算法设置成 HS512,然后再设置一下签发令牌使用的密钥,应该是 258369,定义令牌的时候我们告诉了 SurrealDB ,解密 xuanwu_token 这种令牌的时候要使用的密钥就是 258369。
然后把刚才复制的东西粘贴到 payload 里面,作为令牌的主体。因为我们定义的令牌放在了作用域这个层级,所以在令牌的主体里,需要 NS 作用域,DB 数据库,还需要一个 SC,表示作用域。这个 ID 的值应该是用户的 ID。
在令牌的主体数据里面需要再添加一个 TK,指定一下令牌的名字,这个名字就是当初我们自己定义令牌的时候设置的,设置成 xuanwu_token。令牌的 iss 是令牌的签发者,可以设置成“玄武后端”。
测试
复制一下生成的令牌。回到 HTTP 客户端,修改一下“测试用户权限” 这个请求的身份验证,用刚才复制的令牌替换一下这个 TOKEN 的值。
发送请求,得到的结果就是 $token 这个变量的值。说明 SurrealDB 成功验证了这个令牌。再试一下 SELECT * FROM $auth,返回的结果就是当前用户相关的数据。