2024-02-21 20:46:15 +08:00
|
|
|
|
# SouthBay Accounts
|
|
|
|
|
|
|
|
|
|
南湾用户登录服务。
|
2024-02-29 12:58:16 +08:00
|
|
|
|
|
|
|
|
|
## 编译
|
|
|
|
|
|
|
|
|
|
在运行服务端的服务器上生成密钥对,并把私钥命名为`id_rsa`放在`src/`中后编译。
|
|
|
|
|
|
|
|
|
|
运行`cargo build --release`编译。
|
2024-02-21 20:46:15 +08:00
|
|
|
|
|
|
|
|
|
## 登录流程
|
|
|
|
|
|
|
|
|
|
用户只能每3秒发送一次登录请求。每3秒发送超过30次登录请求视为攻击行为,禁止请求的ip`3600`秒。
|
|
|
|
|
|
|
|
|
|
客户端依次发送以下三个请求。
|
|
|
|
|
|
|
|
|
|
每个请求都先发送一个字节表示请求编号。
|
|
|
|
|
|
|
|
|
|
* 编号1`prelogin`:客户端向服务端请求tcp连接并发送私钥加密的`southbayhub login:{id}`,
|
|
|
|
|
服务端回复一个公钥加密的`southbayhub server`、`already logged`或`unexist`,连接断开。
|
|
|
|
|
服务端账户由`unlinked`状态进入`logining`状态10秒,超过10秒视为登录失败。
|
|
|
|
|
客户端通过解密字符串验证服务端的有效性,并选择停止登录或继续登录。
|
|
|
|
|
* 编号2`login`:客户端向服务端请求tcp连接并发送私钥加密的`{id}|{passwd}`,
|
|
|
|
|
服务端根据是否超时以及账号和密码的正确性回复公钥加密的`unprelogged`、`logged in`、
|
|
|
|
|
`passwd incorrect`,连接断开。
|
|
|
|
|
服务端账户进入`logged`状态60秒,超过60秒进入`nonavailable`状态。
|
|
|
|
|
* 编号3`heartbeat`:客户端向服务端请求tcp连接并发送私钥加密的`{id}`后服务端的`logged`状态计时归零,
|
|
|
|
|
处于`unavailable`状态的换回`logged`状态并将计时归零。处于其它状态的什么都不做。
|
|
|
|
|
* 编号4`logout`:客户端向服务端请求tcp连接并发送私钥加密的`{id}`。所有的用户数据项重新写回数据库。
|
|
|
|
|
|
|
|
|
|
## 数据库
|
|
|
|
|
|
|
|
|
|
使用`sqlite3`。
|
|
|
|
|
|
|
|
|
|
### 用户数据项
|
|
|
|
|
|
|
|
|
|
项目|说明
|
|
|
|
|
:-:|:-
|
|
|
|
|
`id`|用户唯一标识符,用户名的md5前8字节。
|
|
|
|
|
`name`|用户名,不可以更改。
|
|
|
|
|
`passwd`|用户密码的sha512值字符串的md5值,客户端应发送sha512,数据表应存储sha512值的md5值16进制字符串。
|
|
|
|
|
`email`|用户邮箱。
|
|
|
|
|
`avatar`|用户头像。一个服务端资源id。
|
|
|
|
|
|
|
|
|
|
```sql
|
|
|
|
|
CREATE TABLE users (
|
|
|
|
|
id BIGINT PRIMARY KEY,
|
|
|
|
|
name VARCHAR(128),
|
|
|
|
|
passwd CHAR(32),
|
|
|
|
|
email TEXT,
|
|
|
|
|
avatar INT
|
|
|
|
|
);
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 资源数据项
|
|
|
|
|
|
|
|
|
|
项目|说明
|
|
|
|
|
:-:|:-
|
|
|
|
|
`id`|资源id
|
|
|
|
|
`path`|资源路径
|
|
|
|
|
|
|
|
|
|
```sql
|
|
|
|
|
CREATE TABLE resource (
|
|
|
|
|
id INT PRIMARY KEY,
|
|
|
|
|
path TEXT
|
|
|
|
|
);
|
|
|
|
|
```
|