关于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]; }]; }