由于服务器端对于调用API获取数据接口进行了限制,需要在调用API之前获取一个access-token,所以需要在iOS里实现获取这个access-token的功能。 服务器端是在ASP.NET中基于Owin OAuth使用Client Credentials Grand方式发放Token,具体的实现细节可以参考这篇博客

根据服务端提供的测试代码,如下:

private async Task GetAccessToken(string grantType, string userName = null, string password = null)
{
    var parameters = new Dictionary<string, string>();

    parameters.Add(");

    parameters.Add(");

    ";

    ";

    var parameters = new Dictionary<string, string>();

    parameters.Add("grant_type", grantType);

    if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(password))
    {
         parameters.Add("username", userName);
         parameters.Add("password", password);
    }

   _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
        "Basic",
        Convert.ToBase64String(Encoding.ASCII.GetBytes(clientId + ":" + clientSecret))
    );

    var response = await _httpClient.PostAsync("/token", new FormUrlEncodedContent(parameters));

    var responseValue = await response.Content.ReadAsStringAsync();
}

通过上面的代码就可以看出在客户端需要做下面几件事情:

1、对client_id和client_secret进行Base64String编码,在iOS里有专门对NSString进行Base64编码的库,具体请参见NSData+Base64

2、将grant_type为"client_credentials"作为参数Post给服务器地址;

3、最后需要注意的是AFNetWorking 实现Basic 验证的时候,传值的时候注意Basic后面有一个空格,然后设置Content-Type为"application/x-www-form-urlencoded;charset=UTF-8"。这样就可以拿到access_token。代码如下:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSString *client_id = ";
NSString *client_secret = ";

NSString *authStr = [NSString stringWithFormat:@"%@:%@",client_id,client_secret];
NSData *authData = [authStr dataUsingEncoding:NSUTF8StringEncoding];
NSString *authValue = [NSString stringWithFormat:]];

[manager.requestSerializer setValue:authValue  forHTTPHeaderField:@"Authorization"];
[manager.requestSerializer setValue:@"application/x-www-form-urlencoded;charset=UTF-8" forHTTPHeaderField:@"Content-Type"];

NSDictionary *params = @{@"grant_type":@"client_credentials"};

[manager POST:@"http://api.cnblogs.com/token" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", [error description]);
}];

这样就完成了本次场景的需求。实验以Basic 验证方式获取access_token。这样拿到服务端的授权以后就可以调用公开的API列表啦。

使用AFNetWorking 实现以Basic Authentication方式获取access-token的更多相关文章

  1. 【Azure Developer】使用 Microsoft Authentication Libraries (MSAL) 如何来获取Token呢 (通过用户名和密码方式获取Access Token)

    问题描述 在上一篇博文<[Azure Developer]使用 adal4j(Azure Active Directory authentication library for Java)如何来 ...

  2. 通过重复运行的Microsoft Flow由OAuth认证后获取Access Token并将其更新到实体记录

    我是微软Dynamcis 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  3. 工作笔记—新浪微博Oauth2.0授权 获取Access Token (java)

    java发送新浪微博,一下博客从注册到发布第一条微博很详细 利用java语言在eclipse下实现在新浪微博开发平台发微博:http://blog.csdn.net/michellehsiao/art ...

  4. 自定义菜单和高级接口-获取Access Token

    自定义菜单和高级接口都需要使用APPID和AppSecret来创建. 对应暂时没有这些权限的微信公众账号,开发者可以申请测试账号来体验和测试体验微信公众平台的所有高级接口的功能.链接 https:// ...

  5. 基于DotNetOpenAuth的OAuth实现示例代码: 获取access token

    1. 场景 根据OAuth 2.0规范,该场景发生于下面的流程图中的(D)(E)节点,根据已经得到的authorization code获取access token. 2. 实现环境 DotNetOp ...

  6. 新浪微博Oauth2.0授权 获取Access Token

    新浪微博开放平台提供了丰富的API接口,利用这些接口,开发者能够开发出独具特色的微博应用.但是,大部分接口都需要用户授权给应用,应用利用授权得到的Access Token来调用相应的接口来获取内容. ...

  7. SharePoint Online 使用 adal js 获取access token

    最近在写一些SharePoint 的sample code, 有兴趣的小伙伴可以查看我的GitHub. 今天给大家介绍SharePoint Framework (SPFx  )web part 当中怎 ...

  8. OAuth2.0 微博登陆网站功能的实现(一)获取用户授权及令牌 Access Token

    在登陆一些网站的时候,可以选择登陆方式为第三方登陆,例如微博登陆,以爱奇艺为例,进入首页,点击 ”登陆“,会弹出登录框: 除了本站登陆外,还可以选择其他第三方登陆,比如微博登陆.QQ 登陆.微信登陆等 ...

  9. 微信公众平台开发视频教程-03-获取Access Token和获取微信服务器IP,添加微信菜单

    1 获取access token 此token是以后每次调用微信接口都会带上的票据,token是公众号全局唯一票据,在调用其他接口之前都需要先得到token,taoken长度至少512个字符,通常用s ...

随机推荐

  1. vim 设置行号

    1.打开vim 输入 :echo $VIM 查看vim路径 一般是/use/share/vim 2.sudo vim vimrc 打开配置文件,G到文件末尾 3. 插入 :set number 保存推 ...

  2. caffe中的BatchNorm层

    在训练一个小的分类网络时,发现加上BatchNorm层之后的检索效果相对于之前,效果会有提升,因此将该网络结构记录在这里,供以后查阅使用: 添加该层之前: layer { name: "co ...

  3. AX2012 引用NOPI 添加图片到EXCEL

    void AddPieChart(int rowNum = 4) { System.Byte[] bytes; fileName _fileName; NPOI.HSSF.UserModel.HSSF ...

  4. 在命令行下使用perl

    http://blog.sina.com.cn/s/blog_4af3f0d20100g9oz.html aaa@domain.com  2aaa@domain.com 111bbb@home.com ...

  5. .net DropDownList静态联动

    1.前台 <span id="spnClient" style="margin-left: 30px; margin-top: 10px"> < ...

  6. C#实现对远程服务器的内存和CPU监控

    C#实现对远程服务器的内存和CPU监控小记 1.  主要使用到的组件有System.Management.dll 2.  主要类为 :ManagementScope 连接远程服务器示例代码: priv ...

  7. 第五篇:白话tornado源码之褪去模板的外衣

    上一篇<白话tornado源码之请求来了>介绍了客户端请求在tornado框架中的生命周期,其本质就是利用epoll和socket来获取并处理请求.在上一篇的内容中,我们只是给客户端返回了 ...

  8. iOS 9后修改状态栏方法

    1.plist文件中添加View controller-based status bar appearance字段 值为NO 2.程序中添加 [UIApplication sharedApplicat ...

  9. C# async and await

    C# 5.0中引入了async 和 await.这两个关键字可以让你更方便的写出异步代码. 看个例子: public class MyClass { public MyClass() { Displa ...

  10. git 远程版本库,github提供服务原理,git自动更新发送邮件

    1.安装好Linux,安装好Git(192.168.1.239) 2.创建一个用户zph(让此用户提供git on server),密码设置为12345678 # useradd zph # pass ...