Twitter、新浪微博、豆瓣我说的OAuth认证示例

27 条评论

在这里介绍的 OAuth 认证过程示例是利用上一篇所说的“简版 OAuthr 认证 for C#“里的代码,针对的只是单一的功能,和那些已经很完善的但是很复杂的成品类库不存在可比性。另外,这也是目前“一堆微博客”中所使用的部分代码,因此,如果有好的改进建议,希望留言提出来,感谢 :)

简单地说,目前这三家服务所支持的 OAuth 1.0/1.0a 协议认证过程包含3个步骤。

  1. 使用已有的 consumer key 和 consumer secret 生成参数,换取未授权的 Request Token
  2. 用户手动授权 Request Token
  3. 使用 consumer key、consumer secret 和 Request Token 换取 Access Token

至于更加详细地步骤说明,请参见:OAuth 认证步骤 一文

打断一下,为了更好地适合一些意外情况,将”简版 OAuthr 认证 for C#”中的代码做了一些修改,除了统一一下命名方式外, UrlEncode 函数首先判断待转换字符串是否为空,是则直接返回空字符串,而 RequestParams 函数将接收的 message 参数改为 postData,这样可以变得更加通用一些,也算是为将来“一堆微博客”的功能能够更好地扩展。修改的代码见文末。

官方的开发文档地址:twitter豆瓣我说新浪微博,其中豆瓣和twitter并没有明确地说明在认证时需要限定为某一种 HTTP 请求方式,但是新浪微博在每一步中则是指定了 HTTP 请求方式,因此,整个地过程中就要顺着新浪来了,分别为:获取未授权的 Request Token 使用 GET 方式,请求用户授权 Token 使用 GET 方式(可选?),获取授权过的 Access Token 使用 POST 方式。这样,3中服务的授权就可以使用一套通用的代码来完成了。

首先建立一个字典类型的变量来存储要使用的参数

Dictionary<string, string> param = new Dictionary<string, string>();

然后就可以开始第一步的获取 Request Token,在引用了 OAuthBase 命名空间的情况下,只需要一句变可获得所有需要的参数了

»阅读全文

简版 OAuth 认证 for C#

28 条评论

最初是打算直接用 Google Code 上的 oAuthBase.cs 的啊,可是居然不支持 oauth 1.1 规范,虽然修补一下只要稍微加个参数就好了,但是后来又觉得这么多代码对于”一堆微博客“的需求来说又有些过了,搞得那么混乱,零乱,跟我的风格不符...(好吧,我承认,我看不懂找的借口...),所以最终还是按照自己的想法来完成最贴切使用需求的代码。

在继续阅读下去之前,我强烈的要求先看看之前的一篇文章:OAuth认证步骤。因为这里的代码基本就是按照我在那时理解的思路来写的。

首先,是搞清楚自己需要哪些功能,对于“一堆微博客”目前来说,需要的是 OAuth 的认证授权部分和 OAuth 认证更新消息部分,这样,我所需要考虑的情况就少很多了,不用考虑各种参数,而在签名的时候我写死了用 HMACSHA1 也不会产生什么影响... 言归正传,班门弄斧地卖弄一下我的这份代码。

我遇到的第一个问题就很囧,因为在 C# 直接调用的 HttpUtility.UrlEncode() 得到的转义字符串有个特色,比如 HttpUtility.UrlEncode("好好学习"),那么得到的会是 %e5%a5%bd%e5%a5%bd%e5%ad%a6%e4%b9%a0 ,不过大多数情况下我们需要的应当是 %E5%A5%BD%E5%A5%BD%E5%AD%A6%E4%B9%A0 ,一般时候当然不会出问题,不过在 OAuth 认证时需要生成 base_string ,base_string 又需要进行 UrlEncode,而 base_string 是要拿去签名的,这时候大小写就很有分别了,直接决定了 oauth_signature 是否正确,早期我求助 olly 帮忙写了个转换函数,即检测 HttpUtility.UrlEncode() 的结果,遇到 '%' 的时候再检查后面两个字符,如果遇到是小写字母那么就单独转换为大写,最后再所有的重组起来返回。这样很麻烦是不是,所以后来还是决定参照 oAuthBase.cs 自己单独写一个 UrlEncode 函数。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Security.Cryptography;
  4. using System.Linq;
  5. using System.Text;

以上之后的就不解释了- -

  1.         /// <summary>
  2.         /// 不进行 UrlEncode 的字符
  3.         /// </summary>
  4.         private static string unreservedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~";
  5.         /// <summary> 
  6.         /// 重写的 UrlEncode 函数,因为 HttpUtility.UrlEncode 转义的为小写在签名时可能遇到问题
  7.         /// </summary> 
  8.         /// <param name="source_string">要进行 UrlEncode 的源字符串</param> 
  9.         /// <returns>UrlEncode 转义后的字符串</returns> 
  10.         public static string UrlEncode(string source_string)
  11.         {
  12.             StringBuilder result = new StringBuilder();
  13.             foreach (char symbol in source_string)
  14.             {
  15.                 if (unreservedChars.IndexOf(symbol) != -1)
  16.                 {
  17.                     result.Append(symbol);
  18.                 }
  19.                 else
  20.                 {
  21.                     byte[] temp = Encoding.UTF8.GetBytes(symbol.ToString());
  22.                     foreach (byte tem in temp)
  23.                     {
  24.                         result.Append('%' + Convert.ToString(tem, 16).ToUpper());
  25.                     }
  26.                 }
  27.             }
  28.             return result.ToString();
  29.         }

学着加了注释,要养成好习惯..恩..这个函数和 oAuthBase.cs 中不同的是可以正确地转义中文字符(不是中文字符的一般也不要转义是不是...)。

»阅读全文

Notepad++的C编译环境

14 条评论

因为想要一个简单一点的C编译环境,所以就得自己小配置一下,尽量利用现有的东西。虽然类似内容的文章网上已经很多了,不过自己在操作过程中感觉有些地方有些不同,并且也有需要完善的地方,所以再记录一下。

使用的环境是 Win 7 32bit 、VS2010、Notepad++5.7绿色版,VS2010 里的 cl.exe 版本号为 16.0.30319.1,VS 的安装目录在 S:\Program Files\Microsoft Visual Studio 10.0\ ,Notepad++ 程序的文件则放在 D 盘下。

具体的操作..恩。

1、在系统的环境变量设置,用户环境变量设置中的 PATH 添加 S:\Program Files\Microsoft Visual Studio 10.0\VC\bin,新建环境变量 INCLUDE,值为 S:\Program Files\Microsoft Visual Studio 10.0\VC\include;S:\Program Files\Microsoft SDKs\Windows\v7.0A\Include ,新建环境变量 LIB,值为 S:\Program Files\Microsoft Visual Studio 10.0\VC\lib;S:\Program Files\Microsoft SDKs\Windows\v7.0A\Lib,注意值之间用分号隔开的。

2、从 S:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\ 下拷贝文件 mspdb100.dll 到 S:\Program Files\Microsoft Visual Studio 10.0\VC\bin\ 下,据说遇到意外情况,比如IDE编译时又出问题的话可以将 S:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\mspdbsrv.exe 也一同拷贝到 S:\Program Files\Microsoft Visual Studio 10.0\VC\bin\ 下面去。

3、Notepad++的运行命令为
cmd /k chdir /d $(CURRENT_DIRECTORY) & cl $(FILE_NAME) & PAUSE & EXIT
注意最开始是用的 chdir命令加 /d 参数,最开始我也是使用的 cd 命令..结果很悲剧地抑制提示找不到文件,郁闷了很久才发现问题,我的 Notepad++ 程序目录和当前工作目录并不在同一个盘,CD 命令切换不过去...

4、设置个快捷键吧,设置-管理快捷键...

好叻,没有其他意外的话就能正常工作了。

WordPress 添加 IE9 的 Site Pinning 特性

13 条评论

我一直认为,在自己的网站上给不同浏览器、不同用户提供一些个性化的服务是一件很令人开心的事情,昨天(太平洋时间9月15日...)IE9 Beta 出世,带来了一些很有创意的新特性,比如 Site Pinning

注意到这个新特性之后,就想将其加入到 WordPress 上来,用最简单的 Jump List Tasks 来试试手:如果将网站 Pin 到了 Win 7 的任务栏上,那么在 JumpList 菜单中可以显示最新的5篇文章,且能够根据网站上的内容自行更新,当然,点击对应的项目可以直接打开对应的文章。

太简单了,查看一下 twitter 的源代码示例,马上就能搞定叻,几行代码搞定。在 header.php 的 </header> 之前加入

  1. <?php
  2.     $recentPosts = new WP_Query();
  3.     $recentPosts->query('showposts=5');
  4. ?>
  5. <meta name="application-name" content="iSouth: 一边生活,一边折腾 " />
  6. <meta name="msapplication-tooltip" content="iSouth 是一个博客平台,关注电脑技巧,网络应用,最新资讯等,分享优秀资源,谈论生活,影音媒体......." />
  7. <?php while ($recentPosts->have_posts()) : $recentPosts->the_post(); ?>
  8. <meta name="msapplication-task" content="name=<?php the_title(); ?>; action-uri=<?php the_permalink(); ?>; icon-uri=/favicon.ico" />
  9. <?php endwhile; ?>

看个效果图:

WordPress-Add-IE9-the-Site-Pinning-Characteristics-1

或者,在 Jumplist 里显示网站的分类?根据自己的喜好玩吧-.-

被“劫持”的浏览器新建标签页

9 条评论

这年头,估计随便拉个人出来都知道可以使用一些常见的安全工具(如:我还是不举例了,伤感情...)来修复被恶意篡改的浏览器首页,不过流氓软件们也没停下脚步,他们继续发展其他战场。前段时间,我就遇到了一浏览器的新建标签页被“劫持”的情况。第一次看见的时候,还觉得这软件还真是有创意,从对首页的争夺战争中跳出来,居然别开生面地修改起了默认的新建标签页,并且似乎修改新建标签页比修改浏览器首页的效果更加好。大多数时候,我们看到新建标签页的时间可比看到浏览器首页的时间要长的多!

这个想法好是好,但是对于用户来说,频频亮相的未知导航网站只怕很难获得认同。因为我个人并没有使用杀毒软件及其他的安全工具,所以对他们的功能也并不是太熟悉,我不知道他们现在是否也能轻松地搞定这种情况,如果不嫌麻烦的话,自己修改注册表对应键值为默认就好了。

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\AboutURLs]
"Tabs"="res://ieframe.dll/tabswelcome.htm"

如上,自行修改为默认值,如果需要的话,也可以自己定义一个页面-.-