用户登录流程
用户登录服务器进行身份认证采用SRP安全远程保护机制,详见百度SRP安全远程密码,客户端,host后台进程和服务器直接交互大概流程如下:
用户token请求消息
客户端与host后台进程,以及后台进程与服务器直接的通信采用protobuf进行序列化,用户token请求也即是向host发送新用户名和密码,host启动SRP认证过程,token请求的消息格式如下:
//身份认证信息请求 ui ---> host
message CredentialsRequest
{
enum Type
{
UNKNOWN_TYPE = 0;
REFRESH = 1; //向host请求刷新用户信息
NEW_PASSWORD = 2; //更新密码
UPDATE = 3; //ui刷新用户名/密码信息 --- 重新发起认证
}
Type type = 1; //请求类型
string password = 2; //密码
string username = 3; //用户名
uint64 timestamp = 4; //时戳
string email = 5; //邮箱 -- 暂时没有使用
string mobile = 6; //手机号 -- 暂时没有使用
}
//用户认证结果 host--->UI
message AuthState
{
enum State
{
UNKNOWN = 0;
DISABLED = 1;
CONNECTING = 2;
CONNECTED = 3;
FAILED = 4; //用户密码认证失败
DISCONNECTED = 5; //连接断开
PARAMERROR = 6; //参数错误
}
string device_id = 1; //设备id
State state = 2; //认证状态
}
//请求身份认证
void MainWindow::sendCredentialsRequest(bool update)
{
proto::internal::UiToService message;
//请求认证
proto::internal::CredentialsRequest* request = message.mutable_credentials_request();
request->set_username(userName_.toStdString()); //刷新账号密码
request->set_password(password_.toStdString());
request->set_timestamp(timestamp_);
if (update) {
request->set_type(proto::internal::CredentialsRequest::UPDATE);
}
else {
request->set_type(proto::internal::CredentialsRequest::REFRESH);
}
//发送消息给service
emit sendMessageToIpc(message);
AppHelper::addInfoMessage("Send account request.");
}
SRP认证参考开源项目aspia
protobuf的消息格式定义和SRP远程密码安全机制参考github上有开源项目aspia远程桌面开源项目,因此本专题不做赘述,大家认证读读开源项目代码即可。