iOS开发项目篇—19获取授权过的访问标记

iOS开发项目篇—19获取授权过的访问标记

一、简单说明

  1.获取授权

2.简单说明

说明:

(1)只能使用post请求

(2)post请求的参数有5个,且五个参数都是必须的。

(3)新浪会返回一个JSON,转成OC对象为字典,可以通过Key取出ACCESS_TOKEN。

二、实现

1.导入第三方框架

2.使用字典封装请求参数,五个参数都是必须的,就算少一个都是非法请求。

封装代码

 1     //2.封装请求参数
 2     /*
 3      url:https://api.weibo.com/oauth2/access_token
 4      必选    类型及范围    说明
 5     client_id    true    string    申请应用时分配的AppKey。
 6     client_secret    true    string    申请应用时分配的AppSecret。
 7     grant_type    true    string    请求的类型,填写authorization_code
 8
 9     grant_type为authorization_code时
10      必选    类型及范围    说明
11     code    true    string    调用authorize获得的code值。
12     redirect_uri    true    string    回调地址,需需与注册应用里的回调地址一致。
13      */
14     NSMutableDictionary *params=[NSMutableDictionary dictionary];
15     params[@"client_id"] =@"1972915028";
16     params[@"client_secret"] =@"b255603c4dfd82b4785bf9a808ce2662";
17     params[@"grant_type"] =@"authorization_code";
18     params[@"code"] =code;
19     params[@"redirect_uri"] =@"http://www.cnblogs.com/wendingding/";

关于请求失败的说明:

 1 /**
 2  *  根据code获得一个accessToken(发送一个Post请求)
 3  *  @param code 授权成功后的请求标记
 4  */
 5 -(void)accessTokenWithCode:(NSString *)code
 6 {
 7     //处理操作....
 8     //1.获得请求管理者
 9     AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
10
11     //2.封装请求参数
12     NSMutableDictionary *params=[NSMutableDictionary dictionary];
13     params[@"client_id"] =@"1972915028";
14     params[@"client_secret"] =@"b255603c4dfd82b4785bf9a808ce2662";
15     params[@"grant_type"] =@"authorization_code";
16     params[@"code"] =code;
17     params[@"redirect_uri"] =@"http://www.cnblogs.com/wendingding/";
18
19     //3.发送Post请求
20     [mgr POST:@"https://api.weibo.com/oauth2/access_token" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
21         YYLog(@"请求成功--%@",[responseObject class]);
22     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
23         YYLog(@"请求失败--%@",error);
24     }];
25 }
26 @end

查看结果:

错误说明:Request failed: unacceptable content-type: text/plain

  服务器告诉客户端,返回的是 text/plain类型的数据,但是AFN默认只支持JSON和xml,并不支持这种普通的文本格式。

解决办法:

mgr.responseSerializer为设置服务器返回的类型。默认情况下为:mgr.responseSerializer=[AFJSONRequestSerializer serializer];

1    //1.获得请求管理者
2     AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
3
4 //    mgr.responseSerializer=[AFJSONRequestSerializer serializer];
5     mgr.responseSerializer.acceptableContentTypes=[NSSet setWithObjects:@"text/plain", nil];

这种方法会直接覆盖AFN原有的接收类型JSON,所以建议在AFN内部添加接收类型。

调整和的代码:

  1 //
  2 //  YYOAuthViewController.m
  3 //  08-微博弹出菜单
  4 //
  5
  6 #import "YYOAuthViewController.h"
  7 #import "MBProgressHUD+MJ.h"
  8 #import "AFNetworking.h"
  9
 10 @interface YYOAuthViewController ()<UIWebViewDelegate>
 11
 12 @end
 13
 14 @implementation YYOAuthViewController
 15
 16 - (void)viewDidLoad
 17 {
 18     [super viewDidLoad];
 19
 20     //1.创建UIWebView
 21     UIWebView *webView=[[UIWebView alloc]init];
 22     webView.frame=self.view.bounds;
 23     [self.view addSubview:webView];
 24
 25
 26     //2.加载登陆界面
 27     NSURL *url=[NSURL URLWithString:@"https://api.weibo.com/oauth2/authorize?client_id=1972915028&redirect_uri=http://www.cnblogs.com/wendingding/"];
 28     NSURLRequest *request=[[NSURLRequest alloc]initWithURL:url];
 29     [webView loadRequest:request];
 30
 31     //3.设置代理
 32     webView.delegate=self;
 33 }
 34
 35 #pragma mark-UIWebViewDelegate
 36 /**
 37  *  UIWebView开始加载资源的时候调用(开始发送请求)
 38  */
 39 -(void)webViewDidStartLoad:(UIWebView *)webView
 40 {
 41     [MBProgressHUD showMessage:@"正在努力加载中···"];
 42 }
 43
 44 /**
 45  *  UIWebView加载完毕的时候调用(请求结束)
 46  */
 47 -(void)webViewDidFinishLoad:(UIWebView *)webView
 48 {
 49     [MBProgressHUD hideHUD];
 50 }
 51
 52 /**
 53  *  UIWebView加载失败的时候调用(请求失败)
 54  */
 55 -(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
 56 {
 57     [MBProgressHUD hideHUD];
 58 }
 59
 60 /**
 61  *  UIWebView每当发送一个请求之前,都会先调用这个代理方法(询问代理允不允许加载这个请求)
 62  *  @param request        即将发送的请求
 63  *  @return YES允许加载,NO不允许加载
 64  */
 65 -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
 66 {
 67     //1.获得请求地址
 68     NSString *urlStr=request.URL.absoluteString;
 69
 70     //2.判断url是否为回调地址
 71     /*
 72      https://api.weibo.com/oauth2/authorize?client_id=1972915028&redirect_uri=http://www.cnblogs.com/wendingding/
 73      https://api.weibo.com/oauth2/authorize
 74      https://api.weibo.com/oauth2/authorize#
 75
 76      https://api.weibo.com/oauth2/authorize
 77      range.location==(-1)NSNoFound
 78      range.length==0
 79      http://www.cnblogs.com/wendingding/?code=c3dca3b51ab954bac42ebdb253661e4d
 80      range.location==0
 81      range.length>0
 82      */
 83     //urlStr在字符串中的范围
 84     //设置从等号位置开始,不用再额外的找位置
 85     NSRange range=[urlStr rangeOfString:@"http://www.cnblogs.com/wendingding/?code="];
 86     //判断是否为回调地址
 87     if (range.location!=NSNotFound) {//是回调地址
 88         //截取授权成功后的请求标记
 89         int from=range.location+range.length;
 90         NSString *code=[urlStr substringFromIndex:from];
 91
 92         //根据code获得一个accessToken
 93         [self accessTokenWithCode:code];
 94
 95         //禁止加载回调页面,拿到想要的东西就好了。
 96         return NO;
 97     }
 98     return YES;
 99 }
100 /**
101  *  根据code获得一个accessToken(发送一个Post请求)
102  *  @param code 授权成功后的请求标记
103  */
104 -(void)accessTokenWithCode:(NSString *)code
105 {
106     //处理操作....
107     //1.获得请求管理者
108     AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
109 //    mgr.responseSerializer.acceptableContentTypes=[NSSet setWithObjects:@"text/plain", nil];
110
111     //2.封装请求参数
112     /*
113      url:https://api.weibo.com/oauth2/access_token
114      必选    类型及范围    说明
115     client_id    true    string    申请应用时分配的AppKey。
116     client_secret    true    string    申请应用时分配的AppSecret。
117     grant_type    true    string    请求的类型,填写authorization_code
118
119     grant_type为authorization_code时
120      必选    类型及范围    说明
121     code    true    string    调用authorize获得的code值。
122     redirect_uri    true    string    回调地址,需需与注册应用里的回调地址一致。
123      */
124
125     NSMutableDictionary *params=[NSMutableDictionary dictionary];
126     params[@"client_id"] =@"1972915028";
127     params[@"client_secret"] =@"b255603c4dfd82b4785bf9a808ce2662";
128     params[@"grant_type"] =@"authorization_code";
129     params[@"code"] =code;
130     params[@"redirect_uri"] =@"http://www.cnblogs.com/wendingding/";
131     //3.发送Post请求
132     [mgr POST:@"https://api.weibo.com/oauth2/access_token" parameters:params success:^(AFHTTPRequestOperation *operation, NSDictionary*responseObject) {
133         YYLog(@"请求成功--%@",responseObject);
134     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
135         YYLog(@"请求失败--%@",error);
136     }];
137
138     // Request failed: unacceptable content-type: text/plain
139 }
140 @end

获取授权过的访问标记

说明:

(1)不会再次跳转到授权页面(之前已经拿到了授权标记),多次登录,新浪服务器返回的数据是一样的。

(2)uid==user_id==当前用户的ID,是用户的唯一标识,将来你需要获取当前用户的个人信息,那么就需要把uid传递给新浪的服务器,uid是当前用户在新浪数据库的主键。

(3)access_token:保证某一个应用能够访问某一个用户的数据,只要应用和用户是固定的,那么access_token就是固定的。

(4)两者的区别:

  access_token:一个用户给一个应用授权成功后,就获得一个对应的acess_token。作用:允许一个应用访问一个用户的数据。

  uid:一个用户对应一个uid,每个用户都有自己唯一的uid。

  举例:有A和B两个用户,a,b两个应用,A用户给a,b两个应用授权成功了,B用户给b应用授权成功了。则产生了两个uid,3个access_token。

iOS开发项目篇—19获取授权过的访问标记

时间: 2024-10-11 04:07:53

iOS开发项目篇—19获取授权过的访问标记的相关文章

iOS开发项目篇—18截取授权成功的请求标记

iOS开发项目篇—18截取授权成功的请求标记 一.步骤和说明 新建一个授权分组,创建一个自定义的授权控制器. 把window的根控制器设置为授权控制器,以测试. 自定义控制器代码: 1 // 2 // YYOAuthViewController.m 3 // 4 5 #import "YYOAuthViewController.h" 6 7 @interface YYOAuthViewController () 8 9 @end 10 11 @implementation YYOAut

iOS开发项目篇—34获取用户信息

iOS开发项目篇—34获取用户信息 一.简单说明 需求:获取当前用户的昵称 ,需要获取当前登录用户的个人信息. 查看接口 要求传递的参数 这里要获取的时用户的昵称(所以使用用户id作为参数传入) 二.实现代码 1 - (void)viewDidLoad 2 { 3 [super viewDidLoad]; 4 5 //设置导航栏内容 6 [self setupNavBar]; 7 8 //集成刷新控件 9 [self setupRefresh]; 10 11 //设置用户的昵称为标题 12 [s

iOS开发项目篇—39获取用户未读的微博信息(信息提醒)

iOS开发项目篇—39获取用户未读的微博信息(信息提醒) 一.简单说明 1.实现效果       2.实现 (1)新建一个类,封装请求 查看新浪官方要求的请求参数 该类中的代码设计 YYUnreadCountParam.h文件 1 // YYUnreadCountParam.h 2 //封装请求参数的类 3 4 #import "YYBaseParam.h" 5 6 @interface YYUnreadCountParam : YYBaseParam 7 /**uid true in

iOS开发项目篇—16OAuth授权简介

iOS开发项目篇—16OAuth授权简介 一.资源的授权 在互联网行业,公司要能长期存活下来,用户量很重要,比如腾讯.新浪,它们的用户量是非常巨大的 要想长期留住用户,用户资源(数据)的管理也很重要,如果你经常在不经过用户同意的情况下,把用户的一些资源共享出去,那肯定是留不住用户的,甚至会遭到法律的制裁 但是,有时候确实要把某些用户资源共享出去,比如第三方想访问用户的QQ数据.第三方想访问用户的新浪微博数据 要想把用户资源共享出去,就必须取得用户的同意,那么这里就有个资源授权的问题 资源授权的方

iOS开发项目篇—17OAuth授权过程

iOS开发项目篇—17OAuth授权过程 一.网页演示 1.打开开放平台的地址 2.创建应用 3.填写个人开发者信息 4.创建新的应用 5.查看微博提供的api接口 6.在这里使用的是OAuth2 7.接口的完整说明 说明:提供的URL就是登陆界面 8.创建后的应用信息 9.不能直接访问提供的URL,还需要传入必要的参数 传入必要的参数: client_id true string 申请应用时分配的AppKey // 得知道给哪个应用授权 redirect_uri true string 授权回

iOS开发项目篇—20存储账号信息

iOS开发项目篇—20存储账号信息 一.简单说明 1.不论请求是否成功,都在发送Post请求后,隐藏遮罩. 2.在授权成功后,切换根控制器. (1)说明 切换到控制器有几种情况,要么是切换到新特性,要么是切换到“首页”. 没有必要每次进入程序都需要登录,且每次返回的数据都是一样的,所以只需要把拿到的信息保存到沙盒里就可以了. 判断上次有没有登录成功(把拿到的access_token保存到沙盒中,如果沙盒中有access_token,说明上次登录成功),如果上次登陆成功,那么就判断是否要进入新特性

iOS开发项目篇—36封装微博业务

iOS开发项目篇—36封装微博业务 一.简单说明 1.请求参数面向模型 2.请求结果面向模型 3.对控制器来说应该屏蔽业务细节.不让控制器关心(知道)业务细节,它只需要知道自己在做某个业务 @通过一个专门的业务处理类:处理微博业务细节 说明: 业务:加载新的微博首页数据 实现:给新浪服务器发送一个GET请求 业务:加载更多的首页微博数据 实现1:给新浪服务器发送一个GET请求 实现2:去沙盒中加载以前离线缓存的微博数据  二.实现 1.新建一个微博业务处理类,继承自NSObject 微博业务处理

iOS开发项目篇—21抽取工具类

iOS开发项目篇—21抽取工具类 一.抽取宏 把和应用相关的信息抽取出来 App Key:1972915028 App Secret:b255603c4dfd82b4785bf9a808ce2662 回调地址:http://www.cnblogs.com/wendingding/ (1)appkey和回调页面在很多地方都要用到 (2)如果是不同应用的话,只需要把这几个参数换掉就可以了.把它们抽取成一个宏,写到pch文件中. 项目的PCH文件 1 #import <Availability.h>

iOS开发项目篇—30下拉刷新

iOS开发项目篇—30下拉刷新 一.网络监控 当应用所处的网络环境不好的时候,获取不到相应的网络数据,考虑到用户对应用的使用体验,有必要对网络的状况进行监听. 在程序启动完的时候,监控网络 YYAppDelegate.m文件代码: 1 // 2 // YYAppDelegate.m 3 // 4 5 #import "YYAppDelegate.h" 6 #import "YYOAuthViewController.h" 7 #import "YYCont