注册/登陆
这一部分非常重要。如果不想要让用户随意的创建账号,那么我们需要小心谨慎。
注册
注册接口
注册账号有几种方案:
- 直接通过
- 通过邮件验证
- 实现一个请求列表、管理员在后台通过
- 第二点和第三点同时实现
我们预计将会实现这几个功能。启用这些功能通过寻找环境变量判断。如果服务器启动时在环境变量中找到关于邮件服务器的配置,那么将会启用邮件功能。
预计使用 lettre crate 实现邮件服务。用户需要在环境变量中设置
ARCSERVER_ADMIN_MAIL=M<your mail>
ARCSERVER_MAIL_SMTP_SERVER=<your smtp server>
ARCSERVER_MAIL_PASSWORD=<password>
当这三个参数同时检测到的时候才会启动邮件服务。在官方案例中
extern crate lettre;
extern crate lettre_email;
extern crate mime;
use lettre_email::Email;
use lettre::smtp::authentication::Credentials;
use lettre::{SmtpClient, Transport};
fn main() {
let email_receiver = "YOUR_TARGET_EMAIL";
let mine_email = "YOUR_GMAIL_ADDRESS";
let smtp_server = "smtp.gmail.com";
let password = "YOUR_GMAIL_APPLICATION_PASSWORD"; //需要生成应用专用密码
let email = Email::builder()
.to(email_receiver)
.from(mine_email)
.subject("subject")
.html("<h1>Hi there</h1>")
.text("Message send by lettre Rust")
.build()
.unwrap();
let creds = Credentials::new(
mine_email.to_string(),
password.to_string(),
);
// Open connection to Gmail
let mut mailer = SmtpClient::new_simple(smtp_server)
.unwrap()
.credentials(creds)
.transport();
// Send the email
let result = mailer.send(email.into());
if result.is_ok() {
println!("Email sent");
} else {
println!("Could not send email: {:?}", result);
}
print!("{:?}", result);
mailer.close();
}
可以看到邮件收发并不困难。
邮件发送内容会是一个 url,它应该类似于
https://<your_domain(:port)>/<api_endpoint>/auth?auth_string=<random_string>
这个随机字符串在用户注册的时候生成,并储存在用户信息中。服务器在接受到这个请求之后查询数据库,判断这个字符串是否存在、是否在规定时间内,以此实现验证。
管理员后台验证应该是默认启用的模式。如果要实现没有任何验证(这应该是别的功能测试的时候使用的,非常不建议正式使用)应该使用环境变量
ARCSERVER_NO_ADMIN_AUTH=true
来指定。否则在管理员页面将会显示一个表单,可以看到目前注册是否通过。
用户注册之后,数据库填入的字段有
user_id,
name,
password,
join_date,
user_code,
rating_ptt,
highest_rating_ptt,
character_id,
is_skill_sealed,
is_char_uncapped,
is_char_uncapped_override,
is_hide_rating,
favorite_character,
max_stamina_notification_enabled,
current_map,
ticket,
prog_boost,
email
相关接口
注册接口
('user/', methods=['POST'])
邮箱验证进度查询
('auth/verify', methods=['POST'])
邮箱验证重发
('user/email/resend_verify', methods=['POST'])
删除账号
('user/me/request_delete', methods=['POST'])
登陆
登陆接口
('auth/login', methods=['POST'])
需要实现的功能有
- 验证客户端版本号
- 验证设备信息
- 查验 ip 地址
- 多端登陆自动封号
- 验证账号密码
- ...
返回字段有
{
"success": True,
"token_type": "Bearer",
"user_id": user.user_id,
"access_token": user.token
}