zoukankan      html  css  js  c++  java
  • 关于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];
        }];
        
    }
    
     
  • 相关阅读:
    查找代码行数和查看域名版本
    iOS10里的通知与推送
    计算有多少个岛屿
    java.lang.NoClassDefFoundError: Could not initialize class com.haoyao.shop.common.XXX
    Windows 版本Mongodb 启动
    安装第三方库 报错Python version 2.7 required, which was not found in the registry
    Python 爬虫 报错 403 HTTP Error 403: Forbidden
    廖雪峰 练习 把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字
    利用Python 2.7打印杨辉三角
    MAVEN实战 读书笔记 第二章
  • 原文地址:https://www.cnblogs.com/ZMiOS/p/5052797.html
Copyright © 2011-2022 走看看