年年有"余"

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: Sian

[新浪微博] ios实战开发之仿新浪微博(第四讲:OAuth认证)

  [复制链接]

该用户从未签到

发表于 2015-4-3 13:35:30 | 显示全部楼层
继续学习中,谢谢楼主

该用户从未签到

发表于 2015-4-15 17:23:40 | 显示全部楼层
{:soso_e101:} {:soso_e101:} {:soso_e101:} {:soso_e101:}
  • TA的每日心情
    开心
    2015-4-8 13:41
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2015-6-1 19:18:47 | 显示全部楼层
    hao ba今天我又来了
  • TA的每日心情
    高兴
    2015-10-10 10:21
  • 签到天数: 44 天

    [LV.5]常住居民I

    发表于 2015-6-19 14:09:15 | 显示全部楼层
    继续学习。楼主热心帮助解答问题,给力~
  • TA的每日心情
    高兴
    2015-10-10 10:21
  • 签到天数: 44 天

    [LV.5]常住居民I

    发表于 2015-6-30 16:37:45 | 显示全部楼层
    这讲感觉实现起来需要很多其他知识。新浪认证倒是没啥问题,但是redirect_uri一定要填写对,不然页面总是会显示不正确。另外就是AFNetworking已经更新了版本,下的新版本发现和楼主工程的老版本变化很多。自己对这块的知识没有多少概念,感觉实现起来比较吃力。工程中先用WebView请求服务器的授权。
    //请求
    https://api.weibo.com/oauth2/aut ... ;response_type=code
    这个接口会返回数据code。当打开页面填写完用户名密码后,点击登录,webView会自动把之前服务器返回的code这部分数据再发送给服务器是吗?这都是webView内部来处理的?
  • TA的每日心情
    奋斗
    2022-12-13 21:26
  • 签到天数: 371 天

    [LV.9]以坛为家II

     楼主| 发表于 2015-6-30 21:52:13 | 显示全部楼层
    本帖最后由 Sian 于 2015-6-30 21:53 编辑
    Miul 发表于 2015-6-30 16:37
    这讲感觉实现起来需要很多其他知识。新浪认证倒是没啥问题,但是redirect_uri一定要填写对,不然页面总是会 ...
    1、AFNetworking已经更新了版本没有关系,因为AFNetworking在项目中已经封装了,所以不需要关心AFNetworking的具体细节,至于AFNetworking的新版本特性这里就不做过多讨论,其实很简单只是换几个方法而已,原理是一样的;

    2、SAOAuthController的view是被替换成了webView,不用太在意他是不是浏览器,这里主要做了两件事件:

    2.1、通过通过加载新浪的登录界面发送http请求,验证用户名密码成功后,新浪会返回一个重定向页面,这个重定向页面,这个重定向页面会让你去访问你的kRedirect_uri,即所谓的回调地址。而这个重定向url中包含了我们认证通过后所需要的code值,我们手机端就不让他再去访问重定向url了,只要截取url里面的code就行,这个过程在webView的代理方法中实现:
    [Objective-C] 纯文本查看 复制代码
    #pragma mark 代理方法获取Token
    -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
    {
        // 1、获取全路径,将URL转换成字符串
        NSString *url = request.URL.absoluteString;
        // 2、查找code范围
        NSRange range = [url rangeOfString:@"code="];       // 匹配包含"code="的URL
        if (range.length){                                  // 如果有,取"code="后跟的串,即为requestToken
            NSInteger index = range.location + range.length;
            NSString *requestToken = [url substringFromIndex:index];     
        // 3、换取accessToken
            [self getAccessToken:requestToken];   
            return NO;
        }
        return YES;
    }

    2.2、获取到了code后,调用新浪提供的另一个接口换取AccessToken,这个东西是我们调取所有接口都必传的一个字段:
    [Objective-C] 纯文本查看 复制代码
    -(void)getAccessToken:(NSString *)requestToken
    {
        // SAHttpTool类中自定义方法,实为封装AFNetWorking的方法获取网页数据
        [SAHttpTool httpToolPostWithBaseURL:@"https://api.weibo.com" path:@"oauth2/access_token" params:
         @{
           // 新浪要求必须传递的五个参数
           @"client_id" : kAppKey,
           @"client_secret" : kAppSecret,
           @"grant_type" : @"authorization_code",
           @"code" : requestToken,
           @"redirect_uri" : kRedirect_uri
           // 成功获取JSON
           } success:^(id JSON) {
               MyLog(@"请求成功");
               // 1 将JSON转换成数据模型并归档
               SAAccount *account = [SAAccount accountWithDict:JSON];
               [[SAAccountTool sharedAccountTool] saveAccount:account];
               // 2 跳转到主页面
               self.view.window.rootViewController = [[SAMainController alloc]init];
               // MyLog(@"%@", JSON);
               // 3 清除页面加载提示
               [MBProgressHUD hideAllHUDsForView:self.view animated:YES];
           // 获取信息失败
           } failure:^(NSError *error) {
               // 1 打印错误提示
               MyLog(@"请求失败-%@", [error localizedDescription]);
               // 2 清除页面加载提示
               [MBProgressHUD hideAllHUDsForView:self.view animated:YES];
           }];
    }

    2.3、SAOAuthController理解以上两点就足够了。
  • TA的每日心情
    高兴
    2015-10-10 10:21
  • 签到天数: 44 天

    [LV.5]常住居民I

    发表于 2015-6-30 23:42:42 | 显示全部楼层
    楼主解答非常清楚明了,解答了我心中的很多问题。再次谢谢楼主,能这么热心的解答我的问题。:loveliness:
  • TA的每日心情
    高兴
    2015-10-10 10:21
  • 签到天数: 44 天

    [LV.5]常住居民I

    发表于 2015-7-5 13:15:12 | 显示全部楼层
    给使用AFNetworking2.0以上版本的同学提个醒,新浪返回access_Token数据时,有个坑。
    AFJSONRequestOperation默认不接收text/plain类型的数据,当服务器返回text/plain类型的数据时,会认为出错了。可以通过修改源代码解决问题

    + (NSSet *)acceptableContentTypes {

        return [NSSet setWithObjects:@"text/plain", @"application/json", @"text/json", @"text/javascript", nil];

    }

    该用户从未签到

    发表于 2015-7-22 10:36:39 | 显示全部楼层
    666666666666666

    该用户从未签到

    发表于 2015-7-28 21:43:28 | 显示全部楼层
    代码结构清晰,继续学习中
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|小黑屋|Archiver|iOS开发笔记 ( 湘ICP备14010846号 )

    GMT+8, 2024-4-19 09:08 , Processed in 0.045015 second(s), 16 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表