玩转 Sanity Token 认证,保护你的数据安全
![玩转 Sanity Token 认证,保护你的数据安全](https://cdn.sanity.io/images/ntncowsx/production/0d4c0bbb6cbd4e9baa529cef431fe957469c9272-1280x720.jpg?auto=format)
默认情况下 Sanity 数据集(dateset)是公开访问的,也就说如果别人知道你的 projectId 和 dataset 名称就可以请求你所有的数据,非常不安全。
我们只希望只有我们自己的客户端可以请求数据,禁止其他人访问。接下来为大家介绍如果为将数据请求加上 Token 认证,保护数据安全。
🔑生成 Token
首先,我们需要在 Sanity Manage 的 API 面板中点击 "Add API token",输入 Name,选择 "Viewer" 角色(只能读取数据),然后点击 "Save"。
![](https://cdn.sanity.io/images/ntncowsx/production/e2af07e6ba1794ae942e55214895b5cdb659bcac-630x763.png?w=1200&fit=max&auto=format)
别忘了保管好你的 Token,因为它只会显示一次,如果丢失了只能重新生成。
![](https://cdn.sanity.io/images/ntncowsx/production/2828ff6fb5b888dc2c39df21a1c22774801837fe-916x399.png?w=1200&fit=max&auto=format)
⚙️ 配置客户端
接下来,将生成的 Token 添加到你的 Sanity 客户端配置中,让你的请求携带 Token 身份。
// sanity-config.js
import { createClient } from 'next-sanity'
export const client = createClient({
useCdn: process.env.NODE_ENV === 'production',
// useCdn 为 false 才能使用 previewDrafts
perspective: process.env.NODE_ENV === 'production' ? 'published' : 'previewDrafts',
// 生产环境只显示已发布的文档,开发环境显示所有文档(草稿+已发布文档)
token: '放置你的 Token',
// ...
})
同时,也要设置好 perspective
,这样在生产环境下只会返回已发布的文档。因为添加 Token 认证后默认情况下数据请求会返回所有文档。但是,通常在生产环境我们只需要显示已经发布的文档,详情查看官方关于 perspective 的说明。
当然,以上介绍的配置方法只对服务端请求 Sanity 适用,如果你是在浏览器进行请求,Token 很容易暴露,就不适用于这样配置了,可以查看官方更多的安全方案。
🙈修改数据集可见性
最后一步,进入 Sanity Manage 的 Dataset 面板,将数据集修改为私有。这样一来,只有携带 Token 的请求才能访问你的数据。
![](https://cdn.sanity.io/images/ntncowsx/production/9c0c19be30d0142b402f216cb382d01448ab8277-977x584.png?w=1200&fit=max&auto=format)
需要注意,如果你的项目已经在生产环境运行,那么在添加 Token 后必须重新部署项目,然后再将数据集设置为私有。否则,生产环境的数据请求将会因为没有携带 Token 而失败😱。
🪤踩坑经验
在本地调试时,你可能会遇到这种情况:即使数据集已经设置为私有,但是客户端没有配置 Token 还是可以请求数据。别惊慌,这是因为本地缓存的 Cookie 导致的。清除一下缓存,或者换个浏览器打开,没有配置 Token 的情况下就无法请求数据了。
总之,通过 Token 认证,我们可以确保数据的安全性,为我们的应用增添一层坚实的防护💪。