用户数据的安全性毋庸置疑,下面将从学伴的iOS
部分来进行说明。
全站HTTPS
为了应对数据明文传输隐患这个问题,在学伴中采用了自签名HTTPS方式,后端提供了一个用在客户端的cer证书
- (AFHTTPSessionManager *)sessionManager {
if (_sessionManager == nil) {
_sessionManager = [AFHTTPSessionManager manager];
_sessionManager.responseSerializer = [AFHTTPResponseSerializer serializer];
_sessionManager.securityPolicy = [self customSecurityPolicy];
}
return _sessionManager;
}
- (AFSecurityPolicy*)customSecurityPolicy {
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"https" ofType:@"cer"];//证书的路径
NSData *certData = [NSData dataWithContentsOfFile:cerPath];
NSSet *certSet = [[NSSet alloc] initWithObjects:certData, nil];
// AFSSLPinningModeCertificate 使用证书验证模式
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
// 如果是需要验证自建证书,需要设置为YES
securityPolicy.allowInvalidCertificates = YES;
securityPolicy.validatesDomainName = NO;
[securityPolicy setPinnedCertificates:certSet];
return securityPolicy;
}
LoginToken与Token机制
Q:LoginToken
是什么?
A:客户端通过登录请求提交用户名和密码,服务端验证通过后生成LoginToken
和Token
与该用户进行关联,并将它们返回给客户端,保存在Keychain
中,当Token
失效的时候用来请求新的Token
。用户在另一台设备登录或退出登录的时候LoginToken
会失效,跳转到登录界面。
Q:Token
是什么?
A:客户端在接下来的请求中都会携带Token
,服务端通过解析Token检查请求的合法性, 一段时间后失效(学伴中为2小时)。
Q:为何使用LoginToken
?
A:Token
被窃取的几率较大
如何在Token失效的情况下做到用户无感知重发请求
这其中包含三个部分:
- 请求接口A失败,发现Token失效
- 用
LoginToken
请求新的Token
- 用新的
Token
重新请求接口A
具体实现: XAPIManager请求失败(Token失效,且在BaseApiManager中判断)后,发送通知。然后中间人收到通知,记录下随着通知过来的Object,也就是失败的那个Manager。中间人收到Token刷新成功的回调,拿出刚才拿到的失败的那个Manager,直接调用[XManager loadData]。