# SouthBay Accounts 南湾用户登录服务。 ## 编译 在运行服务端的服务器上生成密钥对,并把私钥命名为`id_rsa`放在`src/`中后编译。 运行`cargo build --release`编译。 ## 登录流程 用户只能每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 ); ```