iOS进阶_密码学(四.抽取登录网络请求的单例)

登录业务逻辑完善
在网络开发中,一般会有一个单例负责所有的网络请求
将这个网络登录的部分代码抽取出来

  1. 新建一个”类”
  2. 复制方法
  3. 调整参数
  4. 测试登录能否成功运行

WTNetworkTools.h

#import <Foundation/Foundation.h>

@interface WTNetworkTools : NSObject
/** 账户 **/
@property(nonatomic,copy)NSString * username;
/** 密码 **/
@property(nonatomic,copy)NSString * password;

/**用户登录*/
-(void)login;

//单例
+(instancetype)shareNetworkTools;

@end

WTNetworkTools.m

#import "WTNetworkTools.h"
#import "NSString+Hash.h"
#import "SSKeychain.h"


#define WTLoginServiceName @"WTLoginServiceName"

@implementation WTNetworkTools

+(instancetype)shareNetworkTools{
    static id instance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[self alloc]init];
        //加载本地账户密码
        [instance loadUserInfo];
    });
    return instance;
}

//加载本地用户信息
-(void)loadUserInfo{
    //加载账号
    self.username = [[NSUserDefaults standardUserDefaults] stringForKey:@"WTLoginServiceName"];
    //找出所有的账号
    self.password = [SSKeychain passwordForService:WTLoginServiceName account:self.username];
}

//获取授权信息 -- 等待设备授权!!
-(NSString *)getKeyWithAccunt:(NSString *)accunt{
    //1.需要授权
    //2.直接返回密钥
    return @"WTKey";
}

//实现登录代码
-(void)login{
    //发请求给服务器 -- 验证
    NSString * user = self.username;
    //密码 明文的!!
    NSString * pwd = self.password;
    // 1. ------------- MD5 加密 --------------
    //    pwd = pwd.md5String;
    // 2. ------------- MD5 加盐 --------------
    //不足:盐是固定的!有人知道!!
    //    pwd = [pwd stringByAppendingString:salt].md5String;
    // 3. ------------- HMAC --------------
    // 在实际开发中,密钥来自于服务器!! 注册的时候!!
    NSString * key = nil;//通过钥匙串访问来获取这个key
    if (key == nil) {
        //1.发送网络请求!获取密钥!!
        //2.展示"小菊花!!!"
        key = [self getKeyWithAccunt:user];
        //展示等待授权页面!!

        //立刻马上保存这个KEY在本地!! -- 通过钥匙串访问!  
    }
    pwd = [pwd hmacMD5StringWithKey:key];

    NSLog(@"现在的密码是:%@",pwd);

    //模拟网络请求!!
    if( [self isLoginWithUserId:user PassWord:pwd]){
        //保存账号密码 明文账号--密码
        [self savePwdWithAccunt:self.username Pwd:self.password];
        NSLog(@"登录成功");
    }else{
        NSLog(@"登录失败");
    }
}

//模拟网络请求 :既然是网络请求..结果返回肯定是异步的!
- (BOOL)isLoginWithUserId:(NSString *)userid PassWord:(NSString *)passw{
    if ([userid isEqualToString:@"WTKey"] && [passw isEqualToString:@"e9cdab82d48dcd37af7734b6617357e6"]) {


        return YES;
    }else{

        return NO;
    }

}

//保存账号密码
-(void)savePwdWithAccunt:(NSString *)accunt Pwd:(NSString *)pwd{
    //保存账号
    [[NSUserDefaults standardUserDefaults] setObject:self.username forKey:@"WTLoginUserName"];
    //同步 -- 立刻马上保存!
    [[NSUserDefaults standardUserDefaults] synchronize];

    //保存密码
    if (accunt.length > 0 && pwd.length> 0) {
        /**
         *  参数
         *  1. 密码明文
         *  2. 服务,可以随便写,但是他是APP的一个标识,建议用BundleID
         *  3. 账号,用户名
         */
        [SSKeychain setPassword:pwd forService:WTLoginServiceName account:accunt];
    }
}
@end
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值