pRESTd 试用笔记(二)——配置篇
在上一篇笔记中我们用最基本的配置在本地运行了 pRESTd ,然而官方文档提供了非常丰富的配置参数来满足不同用户的需求,在做部署的时候,按需调参是必不可少的步骤。虽然官方文档已经非常清晰明了,但我觉得有些常用配置还是值得单独拿出来提一句。
注:下文中每次配置文件的修改都需要重启 pRESTd 才能生效。
用户授权配置
JWT
部署了 pRESTd 之后,在生产环境中,从安全的角度考虑,我们通常希望只允许有权限的人才能访问这些接口。我们可以在 pRESTd 的配置中启用 jwt ,要求所有的 http 请求都需要把授权令牌放在请求头中才可以访问,此时配置文件如下所示(本文所有配置文件的修改都基于这里的内容),将 jwt 部分的 default
改为了 true
migrations = "./migrations"
# debug = true
# enabling debug mode will disable JWT authorization
[http]
port = 3000
[jwt]
default = true
[pg]
host = "127.0.0.1"
user = "prest"
pass = "prest_pw"
port = 5432
database = "prestd"
single = true
## or used cloud factor
# URL = "postgresql://user:pass@localhost/mydatabase/?sslmode=disable"
[ssl]
mode = "disable"
此时再去尝试访问 /tables
就会出现未授权的错误,符合预期。
~ » curl http://localhost:3000/tables
{
"error": "authorization token is empty"
}
AUTH
为了获得授权令牌,我们需要让 pRESTd 知道我们是哪个用户,说白了就是证明“我是我”的过程,而这个过程需要 auth 部分的配合,在上述配置文件中填入相关内容,
...
[auth]
enabled = true
type = "basic"
encrypt = "MD5"
table = "prestd_users"
username = "username"
password = "password"
...
enabled
参数顾名思义,用来控制是否启用该 auth 配置,其他参数的说明可以参见下表,
参数 | 描述 |
type | 授权类型,分为 basic 和 body 两种。关于这两种授权方式可以参考这篇文档,其中 Bearer 即为这里的 body 类型 |
encrypt | 密码加密方式,目前支持 MD5 和 SHA1 两种方式 |
table | 存放用户名和密码的 PostgreSQL 表 |
username | 上述 PostgreSQL 表中用于存放用户名的字段 |
password | 上述 PostgreSQL 表中用于存放加密后密码的字段,例如用户密码为“12345”,加密方式为 MD5 ,那么此列存放的值为“12345”的 MD5 827ccb0eea8a706c4c34a16891f84e7b |
为了简单起见,这里的授权类型选择了 basic
,密码加密方式选择 MD5
,在具体实践中应当针对自己的具体情况使用适合自己的配置。
在 psql
控制台中建表 prestd_users
,表中有两个字段 username
和 password
,分别用于存放用户名和密码,
CREATE TABLE prest.prestd_users (
username VARCHAR(32),
password CHAR(32)
);
然后插入用户,为了说明方便,这里随便起个名字 alice ,密码为 “ password ”,其 MD5 值为 5f4dcc3b5aa765d61d8327deb882cf99
(如何用命令行为字符串生成正确的 MD5 值?),
INSERT INTO prestd_users VALUES ('alice', '286755fad04869ca523320acce0dc6a4');
用令牌访问 prestd 接口
首先通过 /auth
获得令牌,
~ » curl -i -X POST http://127.0.0.1:3000/auth --user "alice:password"
HTTP/1.1 200 OK
Content-Type: application/json
Date: Sat, 19 Mar 2022 22:36:02 GMT
Content-Length: 294
{"user_info":{"id":0,"name":"","username":"alice","metadata":null},"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySW5mbyI6eyJpZCI6MCwibWV0YWRhdGEiOm51bGwsIm5hbWUiOiIiLCJ1c2VybmFtZSI6ImFsaWNlIn0sImV4cCI6MTY0Nzc1MDk2MiwibmJmIjoxNjQ3NzUwOTYyfQ.PK-xPgRe0W4abaQmKlLuptruM49CvuLu1klDXGAY8q0"}
然后用获取的令牌获得所有的数据表,
~ » curl http://localhost:3000/tables -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySW5mbyI6eyJpZCI6MCwibWV0YWRhdGEiOm51bGwsIm5hbWUiOiIiLCJ1c2VybmFtZSI6ImFsaWNlIn0sImV4cCI6MTY0Nzc1MDk2MiwibmJmIjoxNjQ3NzUwOTYyfQ.PK-xPgRe0W4abaQmKlLuptruM49CvuLu1klDXGAY8q0"
[{"schema":"prest","name":"persons","type":"table","owner":"prest"},
{"schema":"prest","name":"persons_id_seq","type":"sequence","owner":"prest"},
{"schema":"prest","name":"prestd_users","type":"table","owner":"prest"}]
缓存配置
pRESTd 也允许用户配置缓存以加速查询响应速度,它将 BuntDB 作为自己的缓存数据库,在收到一条请求时,优先去缓存中查找,如果结果存在则直接返回,不存在的话才去访问数据库,我们通常认为在简单查询方面 KV 数据库的响应速度要快于 SQL 查询,并且在正常的架构中缓存距离 API 比后台数据库(在我们这里是 PostgreSQL )更近,因此这样既减少了 API 返回时间,也降低了后台数据库的查询压力。如果 pRESTd 被部署用于大量查询,非常推荐配置缓存。
缓存的介绍在官网上讲解得比较详细,在此不再赘述每个参数的含义。仿照网上的例子,在配置文件中加入如下内容,
[cache]
enabled = true
time = 10
storagepath = "./"
sufixfile = ".cache.prestd.db"
[[cache.endpoints]]
endpoint = "/prestd/prest/persons"
time = 5
在这里我们告诉 pRESTd ,需要缓存数据表 prest.persons
的全表扫描内容。接下来,我们在表中插入一条数据,
INSERT INTO persons (name, age, gender) VALUES ('Bob', 20, 'male');
然后发送几条请求比较一下 API 响应速度,
~ » curl http://localhost:3000/prestd/prest/persons -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySW5mbyI6eyJpZCI6MCwibWV0YWRhdGEiOm51bGwsIm5hbWUiOiIiLCJ1c2VybmFtZSI6ImFsaWNlIn0sImV4cCI6MTY0Nzc1MDk2MiwibmJmIjoxNjQ3NzUwOTYyfQ.PK-xPgRe0W4abaQmKlLuptruM49CvuLu1klDXGAY8q0"
[{"id":1,"name":"Bob","age":20,"gender":"male"}]%
------------------------------------------------------------
~ » curl http://localhost:3000/prestd/prest/persons -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySW5mbyI6eyJpZCI6MCwibWV0YWRhdGEiOm51bGwsIm5hbWUiOiIiLCJ1c2VybmFtZSI6ImFsaWNlIn0sImV4cCI6MTY0Nzc1MDk2MiwibmJmIjoxNjQ3NzUwOTYyfQ.PK-xPgRe0W4abaQmKlLuptruM49CvuLu1klDXGAY8q0"
[{"id":1,"name":"Bob","age":20,"gender":"male"}]
在 pRESTd 的输出日志上我们可以看到,响应速度的提升非常明显,访问缓存数据所花的时间只需要之前的大约三分之一。
...
[negroni] 2022-03-19T15:51:52-07:00 | 200 | 36.957871ms | localhost:3000 | GET /prestd/prest/persons
[negroni] 2022-03-19T15:51:56-07:00 | 200 | 13.677279ms | localhost:3000 | GET /prestd/prest/persons
...