iOS_20_微博OAuth授权_取得用户授权的accessToken
终于效果图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
OauthViewController.m
//
// OauthViewController.m
// 20_帅哥no微博
//
// Created by beyond on 14-8-5.
// Copyright (c) 2014年 com.beyond. All rights reserved.
// 授权控制器,仅执行一次,取得了当前用户的access_token和uid之后,存档,切换窗体的主控制器 #import "OauthViewController.h" @interface OauthViewController ()<UIWebViewDelegate>
{
// 成员变量记住,不同方法中要用到
UIWebView *_webView;
}
@end @implementation OauthViewController -(void)loadView
{
// 直接让WebView成为控制器的view,避免再次加入
_webView = [[UIWebView alloc]init];
self.view = _webView; } - (void)viewDidLoad
{
[super viewDidLoad]; // 设置代理为当前控制器,以便监听webView的開始载入 和结束 载入
_webView.delegate = self; // 申请认证的地址
NSString *oauthURL = [NSString stringWithFormat:@"https://api.weibo.com/oauth2/authorize?client_id=%@&response_type=code&redirect_uri=%@",kAppKey,kRedirectURL]; // 调用分类的方法,载入申请认证的网址
[_webView loadURLString:oauthURL];
} #pragma mark - 代理 方法
// 開始载入
- (void)webViewDidStartLoad:(UIWebView *)webView
{ log(@"真的開始载入--%@",webView.request.URL);
// 一開始载入就,显示运行进度条
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:webView animated:YES];
hud.labelText = @"页面载入中...";
} // 是否開始载入某个页面
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
log(@"是否能载入--%@",webView.request.URL);
return YES;
} // 页面载入完成
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
log(@"载入完成--%@",webView.request.URL);
// 一旦载入完成,就隐藏进度条
[MBProgressHUD hideAllHUDsForView:webView animated:YES]; // 用户允许授权之后,返回的URL包括授权的request_code,形如: http://www.abc.com/? code=888888888888
// 返回了用户授权的request_code的页面之后,须要截取code,然后继续拼接url,发起第3次请求(这次必须以POST方式),终于返回须要的access_token NSString *reDirectURLContainsCode = _webView.request.URL.absoluteString;
// 分类方法,从左边标记字串的最后面開始,截取剩下的字符串
NSString *code = [reDirectURLContainsCode subStrFromLeftFlagStr:@"?code="];
//假设 不是返回code的url,不做不论什么事情
if (code == nil) return; // 如今准备发起最后一次请求,拼接第3次请求的须要的URL,本次请求返回的东东,才会是最重要的用户的accessToken,也包括了用户的uid
NSString *accessTokenRequestURLStr = [NSString stringWithFormat:@"https://api.weibo.com/oauth2/access_token?client_id=%@&client_secret=%@&grant_type=authorization_code&redirect_uri=%@&code=%@",kAppKey,kAppSecret,kRedirectURL,code]; // 1,创建URL
NSURL *accessTokenRequestURL = [NSURL URLWithString:accessTokenRequestURLStr];
// 2,创建post请求
NSMutableURLRequest *mutRequest = [[NSMutableURLRequest alloc]initWithURL:accessTokenRequestURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
//设置请求方式为POST,默觉得GET
[mutRequest setHTTPMethod:@"POST"]; // 3,连接server,并接收返回的数据
NSData *receivedData = [NSURLConnection sendSynchronousRequest:mutRequest returningResponse:nil error:nil];
// 将server返回的数据转成字串(实质是JSON数据)
NSString *responseStr = [[NSString alloc]initWithData:receivedData encoding:NSUTF8StringEncoding];
log(@"Response json is :%@",responseStr); // 4,从responseStr中(实质是JSON数据)获取到access_token
// 将(JSON数据)转成字典先
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:receivedData options:NSJSONReadingMutableContainers error:nil]; // 通过键,取到access_token
NSString *access_token = [dictionary objectForKey:@"access_token"];
log(@"access token is:%@",access_token);
// 通过键,取到用户的uid
NSString *uid = [dictionary objectForKey:@"uid"];
log(@"uid is:%@",uid); // 授权成功,切换根控制器到主控制器
UIActionSheet *actionSheet = [[UIActionSheet alloc]initWithTitle:@"授权成功" delegate:nil cancelButtonTitle:@"取消" destructiveButtonTitle:@"确定" otherButtonTitles: nil];
[actionSheet showInView:self.view.window]; }
@end
补充说明:
第0步,
先注冊成为开发人员,验证邮箱之后,就能够创建移动应用,
记下系统自己主动为该应用生成的APPKey和APPSecret,
并在应用信息的高级信息中,设置授权完毕的回调页面的地址Redirect_URI
因为这里是手机client,而不是web应用,
因此创建应用的时候,Redirect_URI能够随便写,
但必须全局都使用同一个地址Redirect_URI
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
第1步,
申请未授权的request_code,
实质就是来到微博的登录页面,也就是_webView第一个载入的url
地址格式例如以下:
https://api.weibo.com/oauth2/authorize?
client_id=APPKEY&response_type=code&redirect_uri=https://api.weibo.com/oauth2/default.html
APPKEY就是创建应用时,系统自己主动生成的唯一的应用ID
redirect_uri,必需和创建应用时的自己填写的一致
第2步,
用户输入了帐号和password之后,点击登录,
页面会自己主动转到授权页面,
用户假设点击授权button,此时,页面又会重定向到http://redirectURL/?code=888888888888,
要做的工作,就是截取这个重定向的URL中的code值(每次都不一样),
这个code事实上就是已经授权的request_code,
可是它仅仅是中间人,并不能用它去获取用户的信息
地址格式例如以下:
https://api.weibo.com/oauth2/default.html?
code=fa4efb6310411f948423e69adeabec08
第3步,
用第2步中截取的code,再次拼装url,
发起最后一次请求(必须是POST请求),
此时,server返回的数据才是一个须要的json数据,
它里面包括三个键值对
{
"access_token":"这个才是真正的ACCESS_TOKEN",
"remind_in":"157679999",
"expires_in":157679999,
"uid":"授权了的那个用户的uid"
}
iOS_20_微博OAuth授权_取得用户授权的accessToken的更多相关文章
- 【Java EE 学习 76 上】【数据采集系统第八天】【角色授权】【用户授权】【权限的粗粒度控制】【权限的细粒度控制】
一.角色管理 单击导航栏上的"角色管理"超链接,跳转到角色管理界面,在该界面上显示所有角色,并提供角色的增加和删除.修改超链接. 1.增加新角色(角色授权) 流程:单击增加新角色超 ...
- Lind.DDD.Authorization用户授权介绍
回到目录 Lind.DDD.Authorization是Lind.DDD框架的组成部分,之所以把它封装到框架里,原因就是它的通用性,几乎在任何一个系统中,都少不了用户授权功能,用户授权对于任何一个系统 ...
- 【未完成】mysql数据库安全性配置——用户授权
方式一:从服务设置授权 一:用户授权——从服务设置授权 (1)准备测试环境——不同服务器用户 首先,查看数据库连接当前用户情况,当前连接的只有root用户. select user,host,pass ...
- 亚马逊开发者用户授权 AWS
在开发之前最好的方法是先拿到官网的API文档简单的预览一遍 这里有个中文文档:AWS 开发中文文档 需要准备: 注册成为开发者 创建 AWS 账户 创建 IAM 用户 创建 IAM 策略 创建 IAM ...
- OAuth2.0 微博登陆网站功能的实现(一)获取用户授权及令牌 Access Token
在登陆一些网站的时候,可以选择登陆方式为第三方登陆,例如微博登陆,以爱奇艺为例,进入首页,点击 ”登陆“,会弹出登录框: 除了本站登陆外,还可以选择其他第三方登陆,比如微博登陆.QQ 登陆.微信登陆等 ...
- 用户授权 OAuth 2.0
什么是OAuth OAuth是一个关于授权(Authorization)的开放网络标准,目前的版本是2.0版.OAuth适用于各种各样的包括提供用户身份验证机制的应用程序,注意是Authorizati ...
- OAuth 白话简明教程 2.授权码模式(Authorization Code)
转自:http://www.cftea.com/c/2016/11/6703.asp OAuth 白话简明教程 1.简述 OAuth 白话简明教程 2.授权码模式(Authorization Code ...
- OAuth机制原理(开放授权机制)
1.简述 OAuth(Open Authorization,开放授权)是为用户资源的授权定义了一个安全.开放及简单的标准,第三方无需知道用户的账号及密码,就可获取到用户的授权信息,并且这是安全的. 国 ...
- Android之QQ授权登录获取用户信息
有时候我们开发的app须要方便用户简单登录.能够让用户使用自己的qq.微信.微博登录到我们自己开发的app. 今天就在这里总结一下怎样在自己的app中集成QQ授权登录获取用户信息的功能. 首先我们打开 ...
随机推荐
- eclipse中删除多余的tomcat server
在eclipse菜单中选择Window--Show View--Server--Servers,打开这个服务窗口,将多余的服务删除即可. 如果每次启动中太卡没反应,那就是服务没选择好,或是端口冲突的原 ...
- What is npm?
什么是npm ? npm全称是Node Package Manager npm makes it easy for JavaScript developers to share and reuse c ...
- 2000W条数据,加入全文检索的总结
一) 前期准备测试: 旧版的MySQL的全文索引只能用在MyISAM表格的char.varchar和text的字段上. 不过新版的MySQL5.6.24上InnoDB引擎也加入了全文索引,所以具体信息 ...
- 最近跟mysql的自动shutdown干上了。。。
数据库变大之后,又开始不定时shutdown了. 搜了半天,也没啥用, 根据谋篇写的内容,改了下一个参数 vi /etc/my.cnf 修改innodb_buffer_pool_size = 16 ...
- Java GC算法 垃圾收集器
GC算法 垃圾收集器 概述 垃圾收集 Garbage Collection 通常被称为"GC",它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. ...
- css伪类的说明以及使用(css事件)
CSS伪类的使用(css事件) 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/7670959.html 之前有开发开发App的时候,有同事问我那个列表的条目按下 ...
- C#操作Excel知识点
近期在使用C#操作excel,主要是读取excel模板,复制其中的模板sheet页,生成多个sheet页填充相应数据后另存到excel文件,所用到的知识点如下. 一.添加引用和命名空间 添加Micro ...
- VS2015如何连接mySQL数据库
mySQL数据库 如题,今天给大家简单演示一下VS2015如何连接mySQL数据库. 首先呢,大家需要安装vs2015和mySQL这两个软件,我还安装了一个辅助软件SQ ...
- 我从.net转到java的心得和体会
前言:由于有不少人咨询过我如果从.net转java,有什么技巧吗,我现在就分享我从.net转java的历程,这里不涉及两门语言的比较,记录的都是我个人的观点. 一:从.net转java的初衷 我是20 ...
- html基本标签与属性
HTML 超文本标记语言 html5 建立一个HTML文件:文件名 . 后缀(html) 解析:就是去识别 注释:就是给开发人员开的批注------浏览器不去解析(不去输出) HTML的整体框 ...