实现注册操作(先MIS,后VMS),其中身份字段进行base64加密

This commit is contained in:
free will committed 2021-08-26 19:50:42 +08:00
1 parent 1e146e8eac
commit ca8887af6d
6 files changed
+132 -10

No files matched your search

@@ -36,6 +36,8 @@ public class LoginSMSActivityModel implements LoginSMSActivityContract.Model{
if(encryptedIdentityData==null){
mPresenter.loginFailed("获取身份失败");
return;
}else{
mPresenter.getCodeSuccess("获取身份成功,接下来进行登录操作");
}
// 2. 解密身份数据
byte[] identityData= IdentityEncryptedUtil.decryptedIdentity(username,rawPasswd,encryptedIdentityData);
@@ -20,14 +20,20 @@ import com.pkusz.min_vpn_client.activity.base.MINVpnBaseActivity;
import com.pkusz.min_vpn_client.activity.login.LoginActivity;
import com.pkusz.min_vpn_client.model.OriginalRequest.OriginalRegisterRequest;
import com.pkusz.min_vpn_client.utils.AccountValidatorRegexUtil;
import com.pkusz.min_vpn_client.utils.Base64Util;
import com.pkusz.min_vpn_client.utils.DigestUtilKt;
import com.pkusz.min_vpn_client.utils.KeyManager;
import com.white.countdownbutton.CountDownButton;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.nio.charset.StandardCharsets;
import java.util.Objects;
import MISConnection.Model.MISAuthenticationRequest;
import MISConnection.Model.MISRegisterRequest;
import VMSConnection.Utils.Base64Helper;
import br.com.simplepass.loadingbutton.customViews.CircularProgressButton;
import cn.qjm253.min_vpn.extensions.ActivityExtensionsKt;
import cn.qjm253.quick_android_base.GlideApp;
@@ -107,8 +113,29 @@ public class RegisterActivity extends MINVpnBaseActivity<RegisterActivityPresent
// 获取验证码操作的监听器
getSMScode.setOnClickListener(v -> {
// todo 执行获取验证码的逻辑
System.out.println("执行获取验证码的逻辑");
System.out.println("即将执行获取验证码的逻辑");
// 1. 构造请求包
String rawUsername = Objects.requireNonNull(etUsername.getText()).toString();
String phoenNumber = Objects.requireNonNull(etPhoneNumber.getText()).toString();
if (rawUsername.isEmpty() || phoenNumber.isEmpty() ) {
showWarning("请将确认已经填写手机及名字");
btnRegister.revertAnimation();
return;
}
if (!AccountValidatorRegexUtil.INSTANCE.isUsername(rawUsername)) {
showWarning("请输入有效的用户名,用户名为3-20位,包含字母、数字、下划线,且以字母开头");
btnRegister.revertAnimation();
return;
}
if (!AccountValidatorRegexUtil.INSTANCE.isMobile(phoenNumber)) {
showWarning("请输入有效的手机号");
btnRegister.revertAnimation();
return;
}
MISAuthenticationRequest smsRequest=new MISAuthenticationRequest("/"+rawUsername,
phoenNumber);
// 2. 向MIS发送网络请求
mPresenter.getSMSCode(smsRequest);
});
btnRegister.setBackgroundResource(R.drawable.button_shape_default);
@@ -184,10 +211,26 @@ public class RegisterActivity extends MINVpnBaseActivity<RegisterActivityPresent
// 密码经md5哈希
String md5Password = DigestUtilKt.encodeToMD5(password);
// 初始化Keychain,获得公钥及加密身份。
// 为了避免二进制数据传输中出现乱码,这里的加密身份要经过base64编码。
KeyManager.INSTANCE.initKeyChain("/"+username);
String pubKey=new String(KeyManager.INSTANCE.getKeyChain().getCurrentIdentity().getPubkey()
.getBytes(), StandardCharsets.UTF_8);
System.out.println("mis register pubkey: "+pubKey);
String PrikeyEncrypted;
try {
PrikeyEncrypted= Base64Helper.Base64BasicEncode(
KeyManager.INSTANCE.getKeyChain().exportSafeBag("").getValue());
} catch (Exception e) {
e.printStackTrace();
return;
}
// 传递注册请求信息,执行注册网络请求
MISRegisterRequest misRegisterRequest=new MISRegisterRequest("/"+username,
pubKey,md5Password,PrikeyEncrypted,phone,verifyCode);
OriginalRegisterRequest original=new OriginalRegisterRequest(
username,md5Password,phone,email,inviteCode);
mPresenter.register(original);
mPresenter.register(misRegisterRequest,original);
});
// 监听键盘是否弹起
@@ -250,6 +293,21 @@ public class RegisterActivity extends MINVpnBaseActivity<RegisterActivityPresent
return new RegisterActivityPresenter(this);
}
@Override
public void getCodeSuccess() {
getCodeSuccess("获取验证码成功");
}
@Override
public void getCodeSuccess(String successMsg) {
showSuccess(successMsg);
}
@Override
public void getCodeFailed(String errMsg) {
showWarning("获取验证码失败: "+errMsg);
}
@Override
public void registerSuccess() {
Toast.makeText(getApplicationContext(),"注册成功",Toast.LENGTH_SHORT).show();
@@ -12,6 +12,8 @@ import android.content.Context;
import com.pkusz.min_vpn_client.activity.base.MINVpnBaseView;
import com.pkusz.min_vpn_client.model.OriginalRequest.OriginalRegisterRequest;
import MISConnection.Model.MISAuthenticationRequest;
import MISConnection.Model.MISRegisterRequest;
import cn.qjm253.quick_android_mvp.base.mvp.BaseModel;
import cn.qjm253.quick_android_mvp.base.mvp.BasePresenter;
@@ -19,19 +21,28 @@ public interface RegisterActivityContract {
interface View extends MINVpnBaseView {
void registerSuccess();
void registerFailed(String errMsg);
void getCodeSuccess();
void getCodeSuccess(String successMsg);
void getCodeFailed(String errMsg);
}
interface Model extends BaseModel {
void register(OriginalRegisterRequest registerRequest);
void register(MISRegisterRequest misRegisterRequest,OriginalRegisterRequest registerRequest);
void registerWithSafetyInfo(OriginalRegisterRequest registerRequest, Context context);
void uploadRegisterFacePicture(String username, OriginalRegisterRequest registerRequest, Context context);
void getSMSCode(MISAuthenticationRequest request);
}
abstract class Presenter extends BasePresenter<RegisterActivityContract.View, RegisterActivityContract.Model> {
void registerSuccess(){}
void registerFailed(String errMsg){}
void register(OriginalRegisterRequest registerRequest){}
void getCodeSuccess(){}
void getCodeSuccess(String successMsg){}
void getCodeFailed(String errMsg){}
void register(MISRegisterRequest misRegisterRequest,OriginalRegisterRequest registerRequest){}
void registerWithSafetyInfo(OriginalRegisterRequest registerRequest, Context context){}
void uploadRegisterFacePicture(String username, OriginalRegisterRequest registerRequest, Context context){}
void getSMSCode(MISAuthenticationRequest request){}
}
}
@@ -9,9 +9,12 @@ package com.pkusz.min_vpn_client.activity.register;
import android.content.Context;
import com.pkusz.min_vpn_client.model.MISRequestAPI;
import com.pkusz.min_vpn_client.model.OriginalRequest.OriginalRegisterRequest;
import com.pkusz.min_vpn_client.model.VMSRequestAPI;
import MISConnection.Model.MISAuthenticationRequest;
import MISConnection.Model.MISRegisterRequest;
import common.LoggerHelper;
public class RegisterActivityModel implements RegisterActivityContract.Model{
@@ -21,14 +24,26 @@ public class RegisterActivityModel implements RegisterActivityContract.Model{
}
@Override
public void register(OriginalRegisterRequest registerRequest) {
public void register(MISRegisterRequest misRegisterRequest, OriginalRegisterRequest registerRequest) {
// 1. 先在MIS进行注册,MIS托管了私钥
Integer code=MISRequestAPI.INSTANCE.registerMIS(misRegisterRequest);
if(code==null) {
mPresenter.registerFailed("MIS注册失败,未成功收到的合法应答");
return;
}else if(code==200) {
mPresenter.getCodeSuccess("MIS注册成功,接下来进行VMS上的注册");
}else{
mPresenter.registerFailed("MIS注册失败,应答码为"+code);
return;
}
// 2. 再通过VMS进行注册,VMS管理VPN用户权限
Integer resCode=VMSRequestAPI.INSTANCE.register(registerRequest);
if(resCode==null) {
mPresenter.registerFailed("注册失败,未成功收到VMS的合法应答");
mPresenter.registerFailed("VMS注册失败,未成功收到VMS的合法应答");
}else if(resCode==200) {
mPresenter.registerSuccess();
}else{
mPresenter.registerFailed("注册失败,VMS应答码为"+resCode);
mPresenter.registerFailed("VMS注册失败,VMS应答码为"+resCode);
}
}
@@ -43,4 +58,16 @@ public class RegisterActivityModel implements RegisterActivityContract.Model{
// 废弃接口
LoggerHelper.warning("model.uploadRegisterFacePicture: 暂停人脸识别注册功能");
}
@Override
public void getSMSCode(MISAuthenticationRequest request) {
Integer resCode= MISRequestAPI.INSTANCE.getSMSCode(request);
if(resCode==null) {
mPresenter.getCodeFailed("获取验证码可能失败,未收到MIS合法应答");
}else if(resCode==200) {
mPresenter.getCodeSuccess();
}else{
mPresenter.getCodeFailed("获取验证码可能失败,MIS应答码为"+resCode);
}
}
}
@@ -11,6 +11,9 @@ import android.content.Context;
import com.pkusz.min_vpn_client.model.OriginalRequest.OriginalRegisterRequest;
import MISConnection.Model.MISAuthenticationRequest;
import MISConnection.Model.MISRegisterRequest;
public class RegisterActivityPresenter extends RegisterActivityContract.Presenter{
public RegisterActivityPresenter(RegisterActivity registerActivity){
mView=registerActivity;
@@ -28,8 +31,23 @@ public class RegisterActivityPresenter extends RegisterActivityContract.Presente
}
@Override
void register(OriginalRegisterRequest registerRequest) {
mModel.register(registerRequest);
void getCodeSuccess() {
mView.getCodeSuccess();
}
@Override
void getCodeSuccess(String successMsg) {
mView.getCodeSuccess(successMsg);
}
@Override
void getCodeFailed(String errMsg) {
mView.getCodeFailed(errMsg);
}
@Override
void register(MISRegisterRequest misRegisterRequest, OriginalRegisterRequest registerRequest) {
mModel.register(misRegisterRequest,registerRequest);
}
@Override
@@ -41,4 +59,9 @@ public class RegisterActivityPresenter extends RegisterActivityContract.Presente
void uploadRegisterFacePicture(String username, OriginalRegisterRequest registerRequest, Context context) {
mModel.uploadRegisterFacePicture(username, registerRequest, context);
}
@Override
void getSMSCode(MISAuthenticationRequest request) {
mModel.getSMSCode(request);
}
}
@@ -144,6 +144,7 @@ public enum MISRequestAPI {
System.out.println("应答码: " + networkResponse.get().Code);
//todo: 这里应当继续解析data字段中的身份或私钥字段,然后将之返回
// todo: 注意,需要进行base64解码
return networkResponse.get().Data;
}