关于OAuth的授权全过程

基本流程:

要获取新浪微博的数据:

1.要在新浪微博的开放平台上注册成为新浪微博的开发者
    *只要一个微博帐号
    *登录到新浪微博的的开放平台:http://open.weibo.com
    *如果还没有成为开发者的话,登录到开放平台,填写相关信息

2.要在开放平台上注册一个应用:(得让新浪微博知道有我们这么一个应用的存在)
    *创建应用:进入到开放平台首页-->点击移动应用-->创建移动应用-->填写相关信息
    *应用信息-->基本信息:
        "App Key":4036192405 -->代表某一个唯一的应用 -- Client_id
        "App Secret":ec7a1f57bd720bebfa5335510afc5796 -->获取访问令牌(Access Token)
    *应用信息-->高级信息-->OAuth2.0 授权设置
        授权回调页(url地址): 用户在登录成功之后,有一个提示用户是否授权的界面,当用户点击允许授权之后,会回调这个地址,回调的时候会把'授权code'拼接在授权回调页后面
        取消授权回调页(url地址):用户在点击取消授权(不同意授权)之后,会回调这个页面,我们可以根据这个页面做相应提示
    *应用信息-->测试帐号
        在应用的开发阶段,新浪不会允许较多的用户去登录这个正在处于开发中的应用,如果想要在开发阶段让别人能够登录的话,只把要别人的帐号添加成为测试帐号:

3.就要通过注册完应用拿到的一些参数去进行登录

    *服务器提供商 -->新浪微博
    *第三方App --> 我们自己
    *用户 -->


    *OAuth 2.0授权登录
    出现的场景:
        *要分享一张图片到新浪微博:
            *先保存到本地,然后打开微博应用,发送微博-->增加用户的操作成本
            *我们自己的APP(第三方App)能不能拿到用户的帐号与密码去登录新浪微博,帮助用户直接在我们的应用里面发送微博
    概念:
        *OAuth 2.0授权登录
            *是一个开放协议-->微信->QQ-->
            *第三方App->可以在用户授权的情况下,去访问用户存储在服务器提供商上面数据
            *可在第三方App不知道用户的帐号与密码的情况下,去进行登录授权
                *其实登录页面就是新浪微博提供
    授权步骤:
        *1.先打开新浪微博提供的登录页面
        *2.进入登录-->获取一个授权码(授权code,授权Token) "要用到授权回调页,填写的时候一定要与在开放平台上面填写的一要致"
            *授权码是怎么返回给我们?-- 通过授权回调页返回给我们
        *3.拿到授权code-->获取访问令牌(Access Token)
            *怎么去获取--新浪官方提供了通过授权code去获取Access Toke的这么一个接口

4.就可以获取新浪微博的数据
    *通过Access Token 去访问新浪微博数据接口(获取首页数据,获取用户的个人信息,发送微博)
    *限制:限制我们未上线的应用,每天可以获取某些接口多少次



5.OAuth 2.0
    首页->文档->移动API->OAuth 2.0授权接口
        请求的地址:https://api.weibo.com/oauth2/authorize
        请求参数:client_id    申请应用时分配的AppKey。 4036192405
                redirect_uri 授权回调地址  http://www.baidu.com/
            重定向://同意授权后会重定向
            http://www.baidu.com/&code=CODE
    首页->文档->移动API->获取授权过的Access Token
        *获取到Access Token ,一定要把返回数据封装成模型
        *并保存(归档-NSCoding协议-->调用NSKeyedArchiver 去归档)
        *如果用户已经登录过的话,下次进入就可以不用登录
            *在appdelegate里面判断是要显示登录页面还是显示新特性页面还是显示tabbarctrl
            *解档:NSKeyedUnArchiver
    保存帐与选择根控制器的逻辑

@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];
    }];
    
}

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