苹果手机下载出现验证了出现AccessToken

iOS_微博OAuth授权_取得用户授权的accessToken
最终效果图:
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 ()
// 成员变量记住,不同方法中要用到
UIWebView *_webV
@implementation OauthViewController
-(void)loadView
// 直接让WebView成为控制器的view,避免再次添加
_webView = [[UIWebView alloc]init];
self.view = _webV
- (void)viewDidLoad
[super viewDidLoad];
// 设置代理为当前控制器,以便监听webView的开始加载 和结束 加载
_webView.delegate =
// 申请认证的地址
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,形如: https://www.abc.com/?code=
// 返回了用户授权的request_code的页面之后,需要截取code,然后继续拼接url,发起第3次请求(这次必须以POST方式),最终返回需要的access_token
NSString *reDirectURLContainsCode = _webView.request.URL.absoluteS
// 分类方法,从左边标记字串的最后面开始,截取剩下的字符串
NSString *code =
[reDirectURLContainsCode subStrFromLeftFlagStr:@?code=];
//如果 不是返回code的url,不做任何事情
if (code == nil)
// 现在准备发起最后一次请求,拼接第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,连接服务器,并接收返回的数据
NSData *receivedData = [NSURLConnection sendSynchronousRequest:mutRequest returningResponse:nil error:nil];
// 将服务器返回的数据转成字串(实质是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];
先注册成为开发者,验证邮箱之后,就可以创建移动应用,
记下自动为该应用生成的APPKey和APPSecret,
并在应用信息的高级信息中,设置授权完成的回调页面的地址Redirect_URI
由于这里是手机客户端,而不是web应用,
因此创建应用的时候,Redirect_URI可以随便写,
但必须全局都使用同一个地址Redirect_URI
申请未授权的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,必需和创建应用时的自己填写的一致
用户输入了帐号和密码之后,点击登录,
页面会自动转到授权页面,
用户如果点击授权按钮,此时,页面又会重定向到https://redirectURL/?code=,
要做的工作,就是截取这个重定向的URL中的code值(每次都不一样),
这个code其实就是已经授权的request_code,
但是它只是中间人,并不能用它去获取用户的信息
用第2步中截取的code,再次拼装url,
发起最后一次请求(必须是POST请求),
此时,服务器返回的数据才是一个需要的json数据,
它里面包含三个键值对
access_token:这个才是真正的ACCESS_TOKEN,
remind_in:,
expires_in:,
uid:授权了的那个用户的uid08:19:35 UTC
版本:6.0.4
系统:centos 7
在使用seafile WebAPI过程中调用文件夹下载方法,后台将会Task线程生成压缩包生成链接地址提供下载。
调用Download Directory方法能正常返回下载地址。
但是,利用生成的下载链接下载文件将会报错,错误提示:Bad access token
{ seahub中的调用seafile_api.get_fileserver_access_token(…) 方法已获取seafile的token,在使用生成的地址下载却是错误的token }
请问@daniel.pan,这个api是我使用错误,还是seafile返回的token有问题呢?
谢谢:wink:
08:25:00 UTC
downloadFile文件下载api,返回的地址是可以使用的。
07:19:45 UTC
我也遇到这个问题了,请问你解决了吗?51CTO旗下网站
基础接口-获取access token
access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
作者:佚名来源:| 16:02
access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
公众平台的API调用所需的access_token的使用及生成方式说明:
1、为了保密appsecrect,第三方需要一个access_token获取和刷新的中控服务器。而其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则会造成access_token覆盖而影响业务;
2、目前access_token的有效期通过返回的expire_in来传达,目前是7200秒之内的值。中控服务器需要根据这个有效时间提前去刷新新access_token。在刷新过程中,中控服务器对外输出的依然是老access_token,此时公众平台后台会保证在刷新短时间内,新老access_token都可用,这保证了第三方业务的平滑过渡;
3、access_token的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新access_token的接口,这样便于业务服务器在API调用获知access_token已超时的情况下,可以触发access_token的刷新流程。
如果第三方不使用中控服务器,而是选择各个业务逻辑点各自去刷新access_token,那么就可能会产生冲突,导致服务不稳定。
公众号可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在微信公众平台官网-开发者中心页中获得(需要已经成为开发者,且帐号没有异常状态)。注意调用所有微信接口时均需使用https协议。
接口调用请求说明
http请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
正常情况下,微信会返回下述JSON数据包给公众号:
{&access_token&:&ACCESS_TOKEN&,&expires_in&:7200}
错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误):
{&errcode&:40013,&errmsg&:&invalid appid&}
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
头条头条热点热点头条
24H热文一周话题本月最赞
讲师:242720人学习过
讲师:89626人学习过
讲师:152668人学习过
精选博文论坛热帖下载排行
本书作者结合自己多年实践经验,从Oracle开发应用中遇到的问题着手,全面系统地介绍Oracle的安装与卸载、数据字典、安全管理以及用PL/SQL开...
订阅51CTO邮刊& &起因是想在微信小程序中获取access_token。
& 之前资源只有一个阿里云虚拟主机和一个域名,于是用C#后端写了GET请求的接口,准备调用自己域名下的接口获取access_token
& 使用微信的wx.request接口
wx.request({
url: "www.xxxxxx.com/home/gettoken",
success:function(res){
console.log(res)
  发现报错,提示该域名不在服务器合法域名中
& 于是去微信小程序的开发设置中的服务器域名配置
& 添加了request合法域名为 xxxxx.com;
& 仍然提示不在合法域名中,仔细一看,原来小程序要求配置的服务器域名必须是https的
& 行,那就去阿里云搞一个证书,登录阿里云管理控制台,列表选择安全(云盾)-》CA证书服务,购买证书
& &等几分钟证书就申请好了,点【下载】
&本人的是云虚拟主机啊,只是服务器上的一个文件夹而已,根本没办法去配置证书,怎么办,然后去查资料,发现可以通过CDN加速或者上负载均衡来实现
&如果你觉得上面两种方式能满足你的需求,请另行百度,总之我是放弃了。
&之后本人就去买了个ECS服务器最低配的那种,选择windows server 2008 R2
准备拿着公网ip在自己的电脑上远程连接桌面,结果提示:
&然后就去查安全组配置,发现该有的都有了
后面升级https需要加一条规则
用网页版的远程连接到服务器上查看是否开启了允许远程连接,是可以的
查看防火墙,关了的,讲道理应该能远程上才对。
&最后发现cmd-》ipconfig发现没有分配Ip地址,于是修改成静态内网Ip,终于远程上了。远程连接不上会有很多种原因,如果按照查询的方法仍然不行的话,建议提交阿里云工单,还是很靠谱的。
&安装IIS,这一步没有任何坑
&发布代码,添加网站绑定
添加HTTPS绑定,选择ssl证书
iis上浏览网站(https)的,发现地址栏是本地,并没有指到我的域名,上面的框里也没有办法修改添加主机名
iis7下面默认HTTPS绑定是无法指定主机头的,但我们可以通过手工修改IIS配置来实现主机头绑定
&打开C:\Windows\system32\inetsrv\config\applicationHost.config
&搜索https
&&&&&&&&&&bindings&&&&&&&&&&&&&&&&&&&&&&binding protocol="https" bindingInformation="*:443" /&      xxxxxxx
      xxxxxx& & & & &/bindings&
&&binding protocol="https" bindingInformation="*:443:你的域名" /&
域名解析中添加服务器ip的解析
& 一切完毕之后,准备开始调用access_token大展身手,结果又提示TLS版本为1.0,至少需要1.2及以上版本
&经查询发现,在IIS7中TLS1.2协议是默认关闭的。
所以我们需要对IIS做下设置,来开启TLS1.2协议。
可使用ssltools工具
&该升级的也升级了
终于,接口通了
阅读(...) 评论()最早的时候,因为不需要太多微信jsapi的支持,使用access_token的机会很少, 所以一直没有有处理缓存的问题。但是后来添加微信分享和扫描二维码的时候,token的使用量激增导致有时候调试2,3个小时, token得访问上线就打到了 。 &本来是想将token存到库中 , 每次读库这样实现。但是在网上看到别人说可以用单例的方式来实现, 既简单又方便。使用时 ,直接从map中取出参数就可以。 尝试一下非常好用。现将代码分享出来。
1 public class TokenSingleton {
//缓存accessToken 的Map
,map中包含 一个accessToken 和 缓存的时间戳
//当然也可以分开成两个属性咯
public final static String weixin_jssdk_ticket_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";
private Map&String, String& map = new HashMap&&();
private TokenSingleton() {
private static TokenSingleton single = null;
// 静态工厂方法
public static TokenSingleton getInstance() {
if (single == null) {
single = new TokenSingleton();
public Map&String, String& getMap(WeixinAccountServiceI weixinAccountService) {
String time = map.get("time");
String accessToken = map.get("access_token");
Long nowDate = new Date().getTime();
if (accessToken != null && time != null && nowDate - Long.parseLong(time) & 3000 * 1000) {
result = accessT
System.out.println("accessToken存在,且没有超时 , 返回单例");
System.out.println("accessToken 超时 , 或者不存在 , 重新获取");
System.out.println("weixinAccountService : " + weixinAccountService);
String access_token=weixinAccountService.getNewAccessToken("gh_ab6e37102f85");
//"这里是直接调用微信的API去直接获取 accessToken 和Jsapi_ticket 获取";
String jsapi_token = getJsapiToken(access_token);
//"获取jsapi_token";
map.put("time", nowDate + "");
map.put("access_token", access_token);
map.put("jsapi_token", jsapi_token);
result = access_
public void setMap(Map&String, String& map) {
this.map =
public static TokenSingleton getSingle() {
public static void setSingle(TokenSingleton single) {
TokenSingleton.single =
public String getJsapiToken(String accessToken){
//获取jsapi_ticket
System.out.println("获取jsapi_ticket");
String jsapi_Url = weixin_jssdk_ticket_url.replace("ACCESS_TOKEN", accessToken);
String jsapi_ticket = null;
net.sf.json.JSONObject jsonObject = WeixinUtil.httpRequest(jsapi_Url, "GET", null);
System.out.println("请求返回数据: " + jsonObject);
// 如果请求成功
if (null != jsonObject) {
System.out.println("jsapi_ticket
"+jsonObject);
jsapi_ticket=jsonObject.getString("ticket");
return jsapi_
阅读(...) 评论()

我要回帖

更多关于 苹果手机下载出现验证 的文章

 

随机推荐