近期在帮人弄一个豆瓣API应用,在豆瓣的OAuth2.0认证过程中遇到了各种问题,同一时候自己须要一个个的尝试与解决,终于完毕了豆瓣API的訪问.作者这里就不再吐槽豆瓣的认证文档了,毕竟人家也不easy.可是作者发现关于豆瓣OAuth认证过程的文章很之少,所以想具体写这样一篇文章方便后面要做相同东西的人阅读.希望文章对大家有所帮助,尤其是想做豆瓣API开发的刚開始学习的人.
        (文章中蓝色字表示官方文档引用,红色字是可能遇到问题及注意,黑色字是作者叙述)

一.误区OAuth1.0认证过程

       你遇到的第一个问题可能就是还在阅读"豆瓣 API OAuth认证"这篇官方文档,而且在疯狂的尝试.我就是这样花费了非常长时间研究了OAuth1.0认证过程,但总是错误,由于他已经过时了.你须要使用OAuth2.0完毕认证过程.阅读"使用OAuth2.0訪问豆瓣API"官方文档.
       
可是OAuth1.0提供的思想还是能够的(安慰自己),并且非常多关于豆瓣博客文档都是基于1.0的认证过程,事实上已经过时.这里也简单讲讲它的基本过程和原理:(OAuth原理和过去Auth1.0认证成果案例)
        它主要是通过Google-OAuth项目提供的C#语言的OAuth库,在自己定义OAuth类中有计算签名值oauth_signature方法,签名方法HMAC-SHA1,还有计算时间戳oauth_timestamp等方法,然后在參照DoubanOAuthBasicSample项目完毕它的认证流程,主要方法是getRequestToken、authorization和getAccessToken.
        豆瓣OAuth1.0官方文档给出的详细四个步骤:获取未授权的Request Token、请求用户授权Request Token、使用授权后的Request Token换取Access Token、使用 Access Token 訪问或改动受保护资源.详细豆瓣 OAuth1.0认证代码:
OAuth类DoubanOAuthBasicSample
        事实上,你仅仅要知道它已经过时,不要在使用该方法就可以.以下才是我想讲述的详细怎样通过C#程序完毕豆瓣的OAuth认证并訪问须要授权的数据.

二.获取autorization_code

      首先在你须要參考的详细豆瓣官方文档就是:http://developers.douban.com/wiki/?title=oauth2
        使用OAuth2.0流程详细例如以下:(官方文档)
        1.应用向豆瓣请求授权
        2.豆瓣为用户显示一个授权页面,用户在此页面确认是否允许授权
        3.假设用户允许授权,应用汇获取到一个訪问令牌(access_token),通过此令牌用户能够訪问授权数据
        4.假设訪问须要授权的Api,请使用https协议,加上access_token的Header.
        以下具体解说
        首先你须要申请API Key,在完毕申请过程中你须要注意3个值:API Key\Secret\回调地址.后面的程序须要应用,当使用的时候我会具体介绍.因为我是桌面client应用,授权流程为native-application flow.
        依据它的详细流程我设计的界面例如以下图所看到的:

      获取authorization_code步骤(官方文档)
      通过在浏览器中訪问以下地址,来引导用户授权并获取authorization_code.
      
https://www.douban.com/service/auth2/auth
      
參数:
      client_id  必选參数,应用的唯一标识,相应于APIKey
      redirect_uri  必选參数,用户授权完毕后的回调地址,通过回调地址获得用户的授权结果.与注冊一致.
      response_type  必选參数,此值能够为code或者token.在本流程中此值为code
      scope  可选參数,申请权限的范围,假设不填,则使用缺省的scope.假设申请多个scope,使用逗号分隔
      
state  可选參数,用来维护请求和回调状态的附加字符串,授权完毕回调时会附加此參数,应用依据此字符串来推断上下文关系.
      注意:此请求必须是HTTP GET方式
      返回结果:
      当用户拒绝授权时,浏览器会重定向到redirect_uri,并附加错误信息
      https://www.example.com/back?error=access_denied
      当用户允许授权时,浏览器会重定向到redirect_uri,并附加autorization_code
      https://
www.example.com/back?code=9b73a4248
      首先,你须要定义变量例如以下,这些变量都是我们须要使用的.当中APIkey\secret\回调地址填写你自己的,以下的被我改过不是源数据☺(操心丢失)

#region 定义变量
//申请的API Key
public string apiKey = "00489f145c2576bd00d9dd3d147064";
//申请的API 密钥
public string apiKeySecret = "72c36131ace8ea";
//申请的回调地址 我的应用URL
public string myurl = "http://www.baidu.com/";
//获取authorization_code
public Uri GetAuthorizationCode = new Uri("https://www.douban.com/service/auth2/auth");
//获取access_token
public Uri GetAccessToken = new Uri("https://www.douban.com/service/auth2/token");
//浏览器返回autorization_code
public string autorizationCode = "";
//AccessToken授权成功后返回的Json数据
public string accessToken = "";
public string userName = "";
public string userId = "";
public string expiresIn = "";
public string refreshToken = "";
#endregion

然后,点击button1(浏览)按钮,同一时候设计视图中为webBrowser1控件加入�DocumentCompleted事件(右键->属性->'闪电图标'事件).同一时候引用命名空间:using System.Web;\using System.Net;\using System.IO;

#region 第一步 浏览 获取authorization_code
//点击"浏览"显示豆瓣登录界面
private void button1_Click(object sender, EventArgs e)
{//获取authorization_code构造URLStringBuilder url = new StringBuilder(GetAuthorizationCode.ToString()); //可变字符串//追加组合格式字符串url.AppendFormat("?client_id={0}&", apiKey);url.AppendFormat("redirect_uri={0}&", myurl);url.AppendFormat("response_type={0}", "code");//url.AppendFormat("scope={0}", "scope=shuo_basic_r,shuo_basic_w");//显示输入URLtextBox1.Text = url.ToString();string Input = url.ToString();//将指定URL载入到WebBrowser控件中webBrowser1.Navigate(Input);
}//文件载入完毕后发生事件
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{//获取当前文档URLstring reUrl = this.webBrowser1.Url.ToString();textBox1.Text = reUrl;//获取https://www.example.com/back?code=9b73a4248中code值if (!string.IsNullOrEmpty(reUrl)){//获取问号后面字符串string LastUrl = reUrl.Substring(reUrl.LastIndexOf("?") + 1, (reUrl.Length - reUrl.LastIndexOf("?") - 1));               //依据參数间的&号获取參数数组 能够获取多个參数此时仅仅需一个codestring[] urlParam = LastUrl.Split('&');foreach (string s in urlParam){//将參数名与參数值赋值给数组 value[0]參数名称 value[1]參数值string[] value = s.Split('=');//MessageBox.Show("參数名称为:" + value[0] + " 參数值为:" + value[1]);if (value[0] == "code"){autorizationCode = value[1];}}}//输出获取code值if (autorizationCode != "") MessageBox.Show(autorizationCode);
}
#endregion

        执行结果例如以下图所看到的,填写完用户邮箱和password,点击授权后获取autorization_code例如以下:

        这里你须要注意的有一下几点:
        1.为什么我的回调地址设置为"http://www.baidu.com/"?
         最初我设置的回调地址为自己定义的一个网址,可是输入邮箱和password后点击授权,总是HTTP 400错误,啥都不能获取.使用IE浏览器也是一样,可是google能获取.后来经过同学提醒(他做腾讯API,资料多,官方文档规范)可能回调地址须要能訪问的网址,所以改成了百度,而且成功获取.由于这一步仅仅须要获取code值,网址并不关键.(可能也有没考虑到的地方)
        2.你须要知道该程序中必须使用GET方法=浏览能够直接訪问.(除设置header,后面讲述)
        在程序中我是直接调用webBrowser1.Navigate(Input);函数訪问的,也能够使用GET方法訪问.GET和POST的差别是你须要知道的,简单来说就是GET后面给的网址參数显示,而POST是隐式的.
        程序和文档中说道的採用GET的方法,并带有參数的都是这样连接的.url+?+參数=參数值&參数=參数值...正如获取code中的URL,它通过浏览器是能够直接訪问的.
        https://www.douban.com/service/auth2/auth?client_id=00489f145c2576bd00d9dd3d147064&redirect_uri=http://www.baidu.com/&response_type=code
        3.你可能会遇到的错误是113 缺少參数required_parameter_is_missing.
        此时你在设置url时,通过StringBuilder可变字符串添加�參数时,须要把全部的必须的參数填写.同一时候,注意你的&和?是否正确填写.你能够參考的官方文档错误报告例如以下:
        http://developers.douban.com/wiki/?title=oauth2
        http://developers.douban.com/wiki/?title=api_v2
        此时,你的第一步获取code已经完毕,接下来是获取access_token的过程.

三.获取access_token

        官方文档接受的获取access_token例如以下:
       
https://www.douban.com/service/auth2/token
       
參数:
       client_id  必选參数,应用的唯一标识,相应于APIKey
        client_sercet 必选參数,应用的唯一标识,相应于豆瓣secret
        redirect_url 必选參数,用户授权后的回调地址
        grant_type 必选參数,此值可为authorization_code或者refresh_token,此时为authorization_code
        code 必选參数,上一步中获取的authorization_code
       
注意:此请求必须是HTTP POST方式
        返回结果为Json格式数据例如以下图所看到的

//获取的数据装换为Json格式 此时返回的json格式的数据
{"access_token":"0e63c03dfb66c4172b2b40b9f2344c","douban_user_name":"Eastmount","douban_user_id":"57279898","expires_in":604800,"refresh_token":"84406d40cc58e0ae8cc147c2650aa2",
}   

当中你须要注意的是四个地方:
        1.怎样使用POST方法发送请求获取应答,这再也不是通过浏览器就能直接訪问的问题.
        2.获取的JSON格式数据怎样通过C#解析.
        3.可能你的訪问不成功,你须要在"我的应用"中加入�測试用户.看看自己的是否加入�.
        4.你可能遇到101 错误的请求方法,invalid_request_method: GET由于你须要採用POST方法.
        
我解说怎样解析JSON格式的数据,这里參照非常多人可能都使用过的方法.
        你须要下载Newtonsoft.Json.dll文件并加入�引用它,參考百度"
C#使用json字符串"方法,最好先把该dll放置到C:\WINDOWS\Microsoft.NET\Framework目录中,里面有非常多dll(我的程序是VS2012 .NET4.5).
        在"解决方式"中鼠标右键引用->加入�引用->浏览->加入�该dll.然后加入�命名空间using Newtonsoft.Json.Linq;将POST方法获取应答string转换为JSON格式转换赋值就可以.详细代码例如以下,同一时候POST方法发送HTTP请求我是通过自己定义函数sendMessage实现的.载入button2(授权)按钮事件.

#region 第二步 授权 获取access_token
private void button2_Click(object sender, EventArgs e)
{//显示输入URLtextBox1.Text = GetAccessToken.ToString();//获取access_token构造POST參数StringBuilder url = new StringBuilder(""); // 可变字符串//追加组合格式字符串url.AppendFormat("client_id={0}&", apiKey);url.AppendFormat("client_secret={0}&", apiKeySecret);url.AppendFormat("redirect_uri={0}&", myurl);url.AppendFormat("grant_type={0}&", "authorization_code");url.AppendFormat("code={0}", autorizationCode);//获取POST提交数据返回内容string AccessContent = sendMessage(GetAccessToken.ToString(), url.ToString());webBrowser1.DocumentText = AccessContent;//获取的数据装换为Json格式 此时返回的json格式的数据JObject obj = JObject.Parse(AccessContent);accessToken = (string)obj["access_token"];   //access_tokenuserName = (string)obj["douban_user_name"];  //豆瓣usernameuserId = (string)obj["douban_user_id"];      //用户idexpiresIn = (string)obj["expires_in"];       //生命周期 604800秒=7天refreshToken = (string)obj["refresh_token"]; //刷新令牌MessageBox.Show(accessToken + "\n" + userName + "\n" + userId + "\n" + expiresIn + "\n" + refreshToken);
}//发送消息Post方法
public static string sendMessage(string strUrl, string PostStr)
{try{//设置消息头CookieContainer objCookieContainer = null;HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strUrl);request.Method = "Post";request.ContentType = "application/x-www-form-urlencoded";request.Referer = strUrl;if (objCookieContainer == null)objCookieContainer = new CookieContainer();request.CookieContainer = objCookieContainer;byte[] byteData = Encoding.UTF8.GetBytes(PostStr.ToString().TrimEnd('&'));request.ContentLength = byteData.Length;using (Stream reqStream = request.GetRequestStream()){reqStream.Write(byteData, 0, byteData.Length);}//Response应答流获取数据string strResponse = "";using (HttpWebResponse res = (HttpWebResponse)request.GetResponse()){objCookieContainer = request.CookieContainer;using (Stream resStream = res.GetResponseStream()){using (StreamReader sr = new StreamReader(resStream, Encoding.UTF8)) //UTF8 {strResponse = sr.ReadToEnd();}}// res.Close();}return strResponse;}catch (Exception e){Console.WriteLine(e.ToString());Console.Read();}return null;
}
#endregion

        执行程序,点击"浏览"授权成果后在点击"授权"的执行结果例如以下图所看到的:

四.使用access_token

        通过前面的步骤我们已经获取了access_token数据,那么如何使用它呢?当我看到豆瓣给出的使用官方文档例如以下时:

curl "https://api.douban.com/v2/user/~me"
-H "Authorization: Bearer a14afef0f66fcffce3e0fcd2e34f6ff4"

我非常头痛啊!那么,如何通过C#实现使用access_token訪问要授权的数据呢?
       
GET https://api.douban.com/v2/user/~me
        该URL是获取当前授权用户信息的,须要必须先进行API认证授权,返回的是当前授权用户信息.因此,使用它全然能够验证授权成果后的操作.详细代码例如以下:

#region 第三步 豆瓣訪问授权数据
private void button3_Click(object sender, EventArgs e)
{try{//获取当前授权用户信息 须要必须先进行API认证授权,返回当前授权的UserInfostring Input = "https://api.douban.com/v2/user/~me";textBox1.Text = Input;//HttpWebRequest对象实例:该类用于获取和操作HTTP请求var request = (HttpWebRequest)WebRequest.Create(Input); //Create:创建WebRequest对象//设置请求方法为GETrequest.Headers.Add("Authorization", "Bearer " + accessToken);request.Method = "GET";//HttpWebResponse对象实例:该类用于获取和操作HTTP应答 var response = (HttpWebResponse)request.GetResponse(); //GetResponse:获取答复//构造数据流对象实例Stream stream = response.GetResponseStream(); //GetResponseStream:获取应答流StreamReader sr = new StreamReader(stream); //从字节流中读取字符//从流当前位置读取到末尾并显示在WebBrower控件中 string content = sr.ReadToEnd();webBrowser1.DocumentText = content;//关闭响应流stream.Close();sr.Close();response.Close();                      }catch (Exception msg) //异常处理{MessageBox.Show(msg.Message);}
}
#endregion

执行结果例如以下图所看到的:

        不要以为这简单的几句代码就非常easy实现了訪问数据,事实上你须要注意一下几点:
        1.你可能会遇到1000错误 须要权限need_permission?
        那时你须要在訪问时设置header,加入�-H "Authorization: Bearer a14afef0f66fcffce3e0fcd2e34f6ff4".採用C#设置标题头的详细代码例如以下:
        request.Headers.Add("Authorization", "Bearer " + accessToken);
        当中你须要注意Bearer后面的空格.并且有同学说他在使用网盘认证时,获取的方法有两种,一种是设置header,一种是在URL后面加上?access_token=值就可以.但我測试了下豆瓣仅仅有设置header能够.
        2.认证过程已经具体叙述了,增删改查其它数据影片信息、用户信息、评论、收藏、关注等方法都类似,感兴趣的能够自己完毕.它的具体设置參数參照豆瓣文档:http://developers.douban.com/wiki/?title=api_v2

五.总结

        最后总结下它的详细步骤,事实上它就是依照豆瓣的文档完毕的,三个步骤:获取authorization_code、获取access_token和使用access_token.你也不能说豆瓣文档讲得不好,事实上实质东西它都讲述清除了.须要的仅仅是你自己的探索,可能刚接触比較新奇和难,但事实上完毕后就发现它非常easy.
        希望该文章对大家有所帮助,尤其是想做豆瓣API开发的而且使用C#的,这方面资料比較少,基本都是php和java的.更希望同学能从该文章中学到一下几个东西:
        1.怎样通过官方文档完毕一个东西,可能遇到的问题都须要自己解决,而不是复制粘贴.
        2.怎样使用C#网络编程GET和POST两种方法HTTP请求并获取应答.
        3.怎样使用C#解析Json格式的数据.
        4.怎样使用OAuth认证API开发,这方面腾讯、新浪等比較完好.
        最后也感谢豆瓣网带给我非常多知识,推荐程序猿也看看文学书籍,如《文学回顾录》和《季羡林 清华园日记》,生活不仅仅有编程啊.假设有错误或不足之处,还请海涵.
        源码免费下载地址:http://download.csdn.net/detail/eastmount/7399075
        (By:Eastmount 2014-5-25 下午6点 原创CSDNhttp://blog.csdn.net/eastmount/)
 

C# 网络编程之豆瓣OAuth2.0认证具体解释和遇到的各种问题及解决相关推荐

  1. C# 网络编程之豆瓣OAuth2.0认证详解和遇到的各种问题及解决

            最近在帮人弄一个豆瓣API应用,在豆瓣的OAuth2.0认证过程中遇到了各种问题,同时自己需要一个个的尝试与解决,最终完成了豆瓣API的访问.作者这里就不再吐槽豆瓣的认证文档了,毕竟人 ...

  2. 基于Spring Security的认证方式_编程UserDetailService_Spring Security OAuth2.0认证授权---springcloud工作笔记124

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 以前都用过springsecurity了,但是没有系统的去看过,这次就系统的看一次. 根据上面的过 ...

  3. Spring Security OAuth2.0认证授权知识概括

    Spring Security OAuth2.0认证授权知识概括 安全框架基本概念 基于Session的认证方式 Spring Security简介 SpringSecurity详解 分布式系统认证方 ...

  4. Spring Security OAuth2.0认证授权

    文章目录 1.基本概念 1.1.什么是认证 1.2 什么是会话 1.3什么是授权 1.4授权的数据模型 1.4 RBAC 1.4.1 基于角色的访问控制 2.基于Session的认证方式 3.整合案例 ...

  5. android新浪微博Oauth2.0认证以及登录

    前言:微博作为新兴的一项网络工具,在某种意义上讲实现了把世界变小的作用.足不出户,也变成了现实.作为程序员我们更加关注的是为我所用.幸好的是微博运行商为我们提供了丰富的接口,我们可以善用这些接口.首先 ...

  6. 【django】用户登录模块实现步骤(二)之QQ登录工具AgentLogin和通过OAuth2.0认证获取openid【33】

    一.QQ登录工具AgentLogin 1.AgentLogin介绍 ⽬前只⽀持 腾讯QQ,微信,微博的第三⽅登录 该⼯具封装了QQ登录时对接QQ互联接⼝的请求操作.可⽤于快速实现QQ登录功能. 2.A ...

  7. Spring Security OAuth2.0认证授权五:用户信息扩展到jwt

    历史文章 [Spring Security OAuth2.0认证授权一:框架搭建和认证测试] [Spring Security OAuth2.0认证授权二:搭建资源服务] [Spring Securi ...

  8. 网易邮箱账号OAuth2.0认证文档

    认证流程 OAuth2.0认证分为3个步骤: 1)用户授权并获取code 2)使用code换取access_token 3)使用access_token获取用户信息 用户授权并获取code URL: ...

  9. 如何支持微软邮箱OAuth2.0认证

    近期收到部分使用微软邮箱的客户反映,在EDI系统中无法连接到他们的企业邮箱中,连接过程中报错: IMAP protocol error. 1 NO LOGIN failed-,经确认是微软停用了邮箱的 ...

最新文章

  1. 卢宇:改善在线教育,人工智能大有可为
  2. 《TensorFlow技术解析与实战》——第3章 可视化TensorFlow 3.1PlayGround
  3. 管家婆有未记账的凭证怎么办_管家婆常见问题
  4. shp系列(六)——利用C++进行Dbf文件的写(创建)
  5. leetcode 622. Design Circular Queue | 622. 设计循环队列(Ring Buffer)
  6. 谈一谈自己对依赖、关联、聚合和组合之间区别的理解
  7. 素材诊断分析助手_资深优化师告诉你广告投放素材都在哪找?(国内篇)
  8. C/C++ 进阶 —— static
  9. 用c语言编写文本游戏,如何用C语言编写游戏.doc
  10. 计算机主板设置中的英语,技嘉主板bios设置教程,技嘉主板bios中英文对照表
  11. 好用的倒计时APP 可以同时开多个倒数计时器的便签
  12. 我的第一篇博客-Hello World
  13. 成年人的世界,不过如此
  14. sqlyog恢复查询记录
  15. python:defaultdict 对象
  16. VisualStudio2019 安装时下载不动或者显示下载失败
  17. 弘辽科技:如何给抖音视频拟写好标题
  18. eclipse新建类auther自填充
  19. mosquitto接口流程图
  20. ffmpeg关于sws_scale的那些事儿

热门文章

  1. 【发现】Pandora's Box Puzzle Game of the Year Edition 原版镜像
  2. keil4在win10上无法启动_斯柯达的一键启动装置除了方便,还有啥功能?
  3. 入门Python数据分析最好的实战项目
  4. Java中intentfiler_【Android - 组件】之IntentFilter的匹配规则
  5. C 语言中 void* 详解及应用介绍
  6. df满足条件的值修改_文科生学 Python 系列 16:泰坦尼克数据 2(缺失值处理)
  7. EOJ Monthly 2020.7 Sponsored by TuSimple 部分题解
  8. 点分治问题 ----------- P3727 曼哈顿计划E[点分治+博弈SG函数打表找规律]
  9. python求圆柱表面积_python基础知识-字典
  10. 音乐与现代计算机技术,计算机技术在音乐教学中应用与研究.doc