码迷,mamicode.com
首页 > 其他好文 > 详细

关于OAuth的授权全过程

时间:2015-12-17 00:37:53      阅读:886      评论:0      收藏:0      [点我收藏+]

标签:

@interface SZMOAuthViewCtrl ()<UIWebViewDelegate>

@end

@implementation SZMOAuthViewCtrl

- (void)viewDidLoad {
    [super viewDidLoad];
    //1.创建一个webview
    UIWebView *webView = [[UIWebView alloc]init];
    webView.delegate = self;
    webView.frame = self.view.bounds;
    [self.view addSubview:webView];
    
    //2.用webView加载登录页面(新浪提供的)
    NSURL *url = [NSURL URLWithString:@"https://api.weibo.com/oauth2/authorize?client_id=2363498717&redirect_uri=http://"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [webView loadRequest:request];

}
#pragma mark webView代理方法
-(void)webViewDidFinishLoad:(UIWebView *)webView{
    
    [MBProgressHUD hideHUD];
}
-(void)webViewDidStartLoad:(UIWebView *)webView{
    [MBProgressHUD showMessage:@"正在加载"];
}
-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{
    [MBProgressHUD hideHUD];
}



-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
    //1.获得url
    NSString *url = request.URL.absoluteString;
    
    //2.判断是否为回调地址
    NSRange range = [url rangeOfString:@"code="];
    if (range.length != 0) {
        //是回调地址
        //截取code=后面的参数值
        NSInteger fromIndex = range.length + range.location;
        NSString *code = [url substringFromIndex:fromIndex];
        //利用code换取一个accessToken
        [self accessTokenWithcode:code];
        //禁止加载回调地址
        return NO;
    }
    return YES;
}
//利用code(授权成功后的request Token)换取一个accessToken
- (void)accessTokenWithcode:(NSString *)code{
//    请求参数
//    必选     类型及范围     说明
//    client_id     true     string     申请应用时分配的AppKey。
//    client_secret     true     string     申请应用时分配的AppSecret。
//    grant_type     true     string     请求的类型,填写authorization_code
//    
//    
//    grant_type为authorization_code时
//    
//    必选     类型及范围     说明
//    code     true     string     调用authorize获得的code值。
//    redirect_uri     true     string     回调地址,需需与注册应用里的回调地址一致。
    //1.创建请求管理者
    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
//    mgr.responseSerializer = [AFJSONResponseSerializer serializer];
    //2.拼接参数
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[@"client_id"] = @"2363498717";
    params[@"client_secret"] = @"2a388124d48d6d52f9b166b4d135e942";
    params[@"grant_type"] = @"authorization_code";
    params[@"code"] = code;
    params[@"redirect_uri"] = @"http://";
    
    [mgr POST:@"https://api.weibo.com/oauth2/access_token" parameters:params success:^(AFHTTPRequestOperation *operation, NSDictionary *responseObject) {
        [MBProgressHUD hideHUD];
        //沙盒路径
        NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
        NSString *path = [doc stringByAppendingPathComponent:@"account.plist"];
        //把返回来的数据转换成模型
        SZMAccountModel *accountMdl = [SZMAccountModel accountWithDict:responseObject];
        //自定义对象必须要用NSKeyedArchiver
        [NSKeyedArchiver archiveRootObject:accountMdl toFile:path];
        //将返回的账号数据存进沙盒(下面这个方法只能往数组和字典里写数据)
//        [responseObject writeToFile:path atomically:YES];
        
        NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
        //当前app的版本号的字符串
        NSString *currentShortVersionStr = [NSBundle mainBundle].infoDictionary[kShortVersionStr];
        //将版本号存储到偏好设置中
        NSString *saveVersionStr = [user objectForKey:kShortVersionStr];
        UIWindow *window = [UIApplication sharedApplication].keyWindow;
        if ([currentShortVersionStr isEqualToString:saveVersionStr]) {
            
            SZMTabBarController *TabBar = [[SZMTabBarController alloc]init];
            window.rootViewController = TabBar;
        }else{
            
            window.rootViewController = [SZMNewFeatureCtrl new];
        }
        //将新的版本号存到偏好设置中
        [user setObject:currentShortVersionStr forKey:kShortVersionStr];
        [user synchronize];

    
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"请求失败%@",error);
        [MBProgressHUD hideHUD];
    }];
    
}

 

关于OAuth的授权全过程

标签:

原文地址:http://www.cnblogs.com/ZMiOS/p/5052797.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!