在计算机身份认证中是令牌(临时)的意思。
APP登录的时候发送加密的用户名和密码到服务器,服务器验证用户名和密码,如果成功,以某种方式比如随机生成32位的字符串作为token,存储到服务器中,并返回token到APP
private void login(final String userName, final String password, String token, String refreshToken, String sdkToken) {
//请求网络登录
final long timeForLogin = System.currentTimeMillis();
Timber.d("start login at " + timeForLogin);
NetManager.getInstance().Login(
new NetManager.Listener<LoginRsp>() {
@Override
public void onResponse(LoginRsp rsp) {
Timber.i("login success rsp:" + rsp);
Timber.w("notifyLoginSuccess Login cost " + (System.currentTimeMillis() - timeForLogin) + "ms");
//获取登录态并存储
handlerLoginRsp(rsp);
}
@Override
public void onErrorResponse(String msg, int code) {
Timber.e("login error:" + msg + "," + code);
notifyLoginFailed(msg, code);
setAccountInfoBean(null);
}
}, userName, Check.isNotEmpty(password) ? MD5Utils.getMD5ofStr(password) : "", token, refreshToken, sdkToken);
}
登录接口调用成功后会返回一个token字符串给APP,APP将它保存在数据库中。
带有token的回包
在网络层面上token明文传输的话会非常的危险,所以建议一定要使用HTTPS,并且把token放在post body里。我们项目这里使用的是thrift协议,协议的请求包和响应包都是需要加密的。
public byte[] getRequest(int requestId) {
Timber.d("getRequest:" + getRequestName());
report.startSend(getRequestName());
Request request = new Request();
request.header = makeHeader(requestId);
request.body = getRequestBody(requestData);
//打包request
byte[] origins = RequestUtil.encode(request).array();
//加密
byte[] encrys = bEncyption ? EncryptionManager.getEncyption().encryption(origins) : origins;
//加协议头
byte[] wraps = bWrapHead ? RequestUtil.wrapHead(encrys) : encrys;
return wraps;
}```
APP拿到token以后请求时,凡是需要验证的地方都要带上该token,然后服务器端验证token,成功返回所需要的结果,失败返回错误信息,让他重新登录。其中服务器上的token设置一个有效期,APP请求时验证token同时验证有效期,过期也需要重新登录。我们项目中,每一个网络请求都会带上token。
public Header makeHeader(int requestId) {
Header header = new Header();
……
header.version = NetConfig.THRIFT_VERSION;
header.token = AccountManager.getInstance().getToken();
header.refresh_token = AccountManager.getInstance().getRefreshToken();
header.accountName = AccountManager.getInstance().getAccountName();
……
return header;
}
当服务器检测到APP携带的token错误或者过期了,会返回错误。APP接受到相应的错误后,提示用户重新登录。
public void onErrorAction() {
……
if (retCode == RetCode.RetCode_CheckToken_Error
|| retCode == RetCode.RetCode_Login_Expire) {
// 弹出登录态过期的对话框,让用户重新登录
UIUtils.showLoginExpireDialog();
}
}
网友评论