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授权登录获取用户信息的功能. 首先我们打开 ...
随机推荐
- C# linq对分组操作执行子查询
本主题演示创建查询的两种不同方式,此查询将源数据排序成组,然后分别对每个组执行子查询. 每个示例中的基本方法是使用名为 newGroup 的"接续块"对源元素进行分组,然后针对 n ...
- sass学习--在htm文件中使用
一.导语 最近的战狼2好火爆啊,每天看战狼2的票房一路高飙,我估计比吴京还开心.看了这部戏的拍摄过程,除了敬佩就是踏实,是的,吴京是电影圈隔了这么久后能踏踏实实做电影的了,纯属个人见解,不喜请忽略.. ...
- HDU3045 Picnic Cows (斜率DP优化)(数形结合)
转自PomeCat: "DP的斜率优化--对不必要的状态量进行抛弃,对不优的状态量进行搁置,使得在常数时间内找到最优解成为可能.斜率优化依靠的是数形结合的思想,通过将每个阶段和状态的答案反映 ...
- selenium元素定位
在网页自动化测试中,我们要让程序自动模拟我们的点击.输入.悬浮.拖动等操作,完成我们的测试用例组. 输入.点击.打开这样的动词,已经包含在了selenium的方法中,可以直接调用(当然你也可以自己写) ...
- Winform C# 简单实现子窗口显示进度条
主窗口代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data ...
- Redis轻快入门
Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作由VMware主 ...
- Python之matplotlib模块安装
numpy 1.下载安装 源代码 http://sourceforge.net/projects/numpy/files/NumPy/ 安装 python2.7 setup.py install 2. ...
- [O]ORACLE物化视图的使用
用于数据复制的物化视图 物化视图的一个主要功能就是用于数据的复制,Oracle推出的高级复制功能分为两个部分,多主复制和物化视图复制.而物化视图复制就是利用了物化视图的功能. 物化视图复制包含只读物化 ...
- 如何完全根据官方下载包搭建hibernate框架
好久没有用s2sh的框架了,最近业务需要又要拾起来.在搭框架时,发现之前都是复制配置文件,对具体的细节却很懵懂,所以要从新来一遍,也是一次新的学习. 我使用的版本是hibernate-release- ...
- Java 8的新特性—终极版
作者:杜琪[译] 原文链接:http://www.jianshu.com/p/5b800057f2d8 1. 简介 毫无疑问,Java 8是Java自Java 5(发布于2004年)之后的最重要的版本 ...