找回密码
 立即注册
首页 业界区 业界 新浪,腾迅,网易微博OAuth统一认证接口实现 ...

新浪,腾迅,网易微博OAuth统一认证接口实现

端木茵茵 2025-5-29 15:45:16
看到国内微博兴起.各大门微博都提供了统一的OAuth认证
开始有想法做一个统一访问接口了.到时候就可以利用各大门户的注册用户来为我们服务
从而也使得最终用户不用每个网站都要去注册一个帐号.还有安全性的问题了
从开始一时兴趣.到专心的架构,把博客园有关OAuth认证的文章都看了一下.
从不知.到了解,到熟悉再到自己造轮子.
利用休息时间.自己终于写好了国内四大门户的三大微博接口.
由于搜狐的文档还没有看.用一般的方式去认证老是失败.等有时间再完工
现在只有新浪,腾迅,网易的认证成功了
接下来.先上图.有图有真相.这是我的架构图
项目地址 http://weibooauth.codeplex.com/ (源代码在这里下载)
欢迎有兴趣的人事进行一起研究.有的话就注册一个codeplex帐号.一起进行开发liuju150@gmail.com
1.png
 
OAuth项目写了几个公共接口分别是
IOAuthConfig这个是得到web.config的配置信息接口
  1. namespace OAuth
  2. {
  3.     public interface IOAuthConfig
  4.     {
  5.         /// <summary>
  6.         /// 得到AppKey
  7.         /// </summary>
  8.         /// <returns></returns>
  9.         string GetAppKey();
  10.         /// <summary>
  11.         /// 得到AppSecret
  12.         /// </summary>
  13.         /// <returns></returns>
  14.         string GetAppSecret();
  15.         /// <summary>
  16.         /// 得到回调URL
  17.         /// </summary>
  18.         /// <returns></returns>
  19.         Uri GetCallBackURI();
  20.         /// <summary>
  21.         /// 得到请求类型
  22.         /// GET,POST,HEADER
  23.         /// </summary>
  24.         /// <returns></returns>
  25.         OAuthEnum.RequestType GetRequestType();
  26.         
  27.     }
  28. }
复制代码
IOAuthMode这个接口得对OAuth认证的参数接口 这里接口比较多
  1. namespace OAuth
  2. {
  3.     public interface IOAuthMode
  4.     {
  5.         /// <summary>
  6.         /// 得到回调地址
  7.         /// </summary>
  8.         /// <returns></returns>
  9.         OAuthParameter GetOAuthCallBack();
  10.         /// <summary>
  11.         /// 得到申请的ConsumerKey
  12.         /// </summary>
  13.         /// <returns></returns>
  14.         OAuthParameter GetOAuthConsumerKey();
  15.         /// <summary>
  16.         /// 设置随机字符串
  17.         /// </summary>
  18.         /// <param name="OAuthNoncd"></param>
  19.         void SetOAuthNonce(string OAuthNonceString);
  20.         /// <summary>
  21.         /// 得到随机字符串
  22.         /// </summary>
  23.         /// <returns></returns>
  24.         OAuthParameter GetOAuthNonce();
  25.         /// <summary>
  26.         /// 得到签名方式
  27.         /// </summary>
  28.         /// <returns></returns>
  29.         OAuthParameter GetOAuthSignatureMethod();
  30.         /// <summary>
  31.         /// 设置时间戳
  32.         /// </summary>
  33.         /// <param name="OAuthTimeStamp"></param>
  34.         void SetOAuthTimeStamp(string OAuthTimeStampString);
  35.         /// <summary>
  36.         /// 得到时间戳
  37.         /// </summary>
  38.         /// <returns></returns>
  39.         OAuthParameter GetOAuthTimeStamp();
  40.         /// <summary>
  41.         /// 得到OAuth版本
  42.         /// </summary>
  43.         /// <returns></returns>
  44.         OAuthParameter GetOAuthVersion();
  45.         /// <summary>
  46.         /// 设置签名字符串
  47.         /// </summary>
  48.         void SetOAuthSignature(string OAuthSignatureString);
  49.         /// <summary>
  50.         /// 得到签名字符串
  51.         /// </summary>
  52.         /// <returns></returns>
  53.         OAuthParameter GetOAuthSignature();
  54.         /// <summary>
  55.         /// 设置OAuthToken
  56.         /// </summary>
  57.         void SetOAuthToken(OAuthParameter OAuthToken);
  58.         /// <summary>
  59.         /// 得到OAuthToken
  60.         /// </summary>
  61.         /// <returns></returns>
  62.         OAuthParameter GetOAuthToken();
  63.         /// <summary>
  64.         /// 设置OAuthTokenSecret
  65.         /// </summary>
  66.         void SetOAuthTokenSecret(OAuthParameter OAuthTokenSecret);
  67.         /// <summary>
  68.         /// 得到OAuthTokenSecret
  69.         /// </summary>
  70.         /// <returns></returns>
  71.         OAuthParameter GetOAuthTokenSecret();
  72.         /// <summary>
  73.         /// 设置OAuthVerifier
  74.         /// </summary>
  75.         /// <param name="OAuthVerifier"></param>
  76.         void SetOAuthVerifier(OAuthParameter OAuthVerifier);
  77.         /// <summary>
  78.         /// 得到OAuthVerifier
  79.         /// </summary>
  80.         /// <returns></returns>
  81.         OAuthParameter GetOAuthVerifier();
  82.         /// <summary>
  83.         /// 得到接口提供商
  84.         /// </summary>
  85.         /// <returns></returns>
  86.         OAuthEnum.OAuthInterface GetOAuthInterface();
  87.     }
  88. }
复制代码
IOAuthRequestURL这个接口是对请求地址的接口
  1. namespace OAuth
  2. {
  3.     public interface IOAuthRequestURL
  4.     {
  5.         /// <summary>
  6.         /// 获取未授权的Request Token
  7.         /// </summary>
  8.         /// <returns></returns>
  9.         Uri GetRequestTokenURL();
  10.         /// <summary>
  11.         /// 请求用户授权Token
  12.         /// </summary>
  13.         /// <returns></returns>
  14.         Uri GetRequestOAuthTokenURL();
  15.         /// <summary>
  16.         /// 获取授权过的Access Token
  17.         /// </summary>
  18.         /// <returns></returns>
  19.         Uri GetRequestAccessTokenURL();
  20.     }
  21. }
复制代码
然后各个微博都实现这里几个接口(看到图片就知道.每个微博都实现了这三个接口)
然后OAuthBase就是实现OAuth认证.
拿新浪来说的OAuth认证反正都是经过三个步骤
第一次.请求RequestToken
得到OAuthToken和OAuthTokenSecret
第二步.用OAuthToken去认证得到OAuthVerifier
第三步就是得到真正的OAuthToken和OAuthTokenSecret
详细实现(新浪)
第一步
oauth_callback(回调地址,要UrlEncoding)
oauth_consumer_key(在新浪申请到的consumer_key)
oauth_nonce(随机字符串,听说腾迅要小于32位.我用GUID)
oauth_signature_method(签名方式,现在都是HMAC-SHA1)
oauth_timestamp(时间戳,1970-1-1 0:0:0到现在时间的整型值)
oauth_version(OAuth版本,新浪,腾迅为1.0a,网易为1.0)(目前)
生成参数字符串.用上面的参数 格式为:参数名1=参数值1&参数名2=参数值2,和URL一样.你懂的
然后string.format("{0}&{1}&{2}",{1:请求方式GET,POST},{2:请求地址UrlEncode(http://api.t.sina.com.cn/oauth/request_token)},{3:UrlEncode(参数字符串)})
这个就是签名的BaseString,然后用你申请得到的AppSecret+"&"为KEY,来进行签名生成签名字符串.然后也要对其UrlEncode
然后生成为签名字符串为oauth_signature的值
然后生成请求URL(GET)
http://api.t.sina.com.cn/oauth/request_token?参数名1=参数值1&参数名2=参数值2
这里和生成参数字符串一样.只是要加上oauth_signature
这里就是请求的URL.然后会得到
oauth_token=ce9cc416a9ad8f37feba547541f81ec9&oauth_token_secret=a6966e6898480428574f04f768da1249
这样第一步RequestToken就完成了
第二步
http://api.t.sina.com.cn/oauth/authorize?oauth_token=ce9cc416a9ad8f37feba547541f81ec9
打开这个地下进行用户认证.这里的oauth_token为第一步得到的oauth_token值
服务器返回oauth_token=ce9cc416a9ad8f37feba547541f81ec9&oauth_verifier=1234567
第三步.
用第一步的参数加上第二步得到的
 oauth_token和oauth_verifier
得到新的签名字条串,然后用AppSecret+"&"+oauth_token_secret(第一步得到的)为KEY对
然后再进行签名(注意这里的oauth_nonce,oauth_timestamp要重新生成)
得到新的oauth_signature
然后像第一步一样生成URL进行请求.
得到真正的oauth_token和oauth_token_secret
然后就可以用这个调用相关接口了
2.png
  1.     protected void imgBtnSina_Click(object sender, ImageClickEventArgs e)
  2.     {
  3.         SinaOAuthMode OAuthMode = new SinaOAuthMode();
  4.         OAuthBase Base = new OAuthBase(new SinaOAuthRequestURL(), new SinaOAuthConfig(), OAuthMode);
  5.         OAuthMode = (SinaOAuthMode)Base.RequestToken();
  6.         string res = string.Format("{0}:{1}&{2}:{3}", OAuthMode.GetOAuthToken().ParameterName, OAuthMode.GetOAuthToken().ParameterValue, OAuthMode.GetOAuthTokenSecret().ParameterName, OAuthMode.GetOAuthTokenSecret().ParameterValue);
  7.         labMsg.Text = res;
  8.         string RequestOAuthTokenURL = Base.GetAccessTokenURL().ToString();
  9.         Session["OAuthMode"] = OAuthMode;
  10.         Page.ClientScript.RegisterStartupScript(GetType(), "W_CallBack", "");
  11.     }
复制代码
点击按钮
  1.     private void SinaCallBack()
  2.     {
  3.         SinaOAuthMode Mode = (SinaOAuthMode)Session["OAuthMode"];
  4.         Mode.SetOAuthToken(new OAuthParameter("oauth_token", Request.QueryString["oauth_token"]));
  5.         Mode.SetOAuthVerifier(new OAuthParameter("oauth_verifier", Request.QueryString["oauth_verifier"]));
  6.         OAuthBase Base = new OAuthBase(new SinaOAuthRequestURL(), new SinaOAuthConfig(), Mode);
  7.         Mode = (SinaOAuthMode)Base.RequestAccessToken();
  8.         Session["OAuthMode"] = Mode;
  9.     }
复制代码
回调页面
  1. <?xml version="1.0"?>
  2. <configuration>
  3.     <configSections>
  4.         <sectionGroup name="SinaSectionGroup">
  5.             <section name="SinaSection" type="System.Configuration.NameValueSectionHandler,System"/>
  6.         </sectionGroup>
  7.         <sectionGroup name="QQSectionGroup">
  8.             <section name="QQSection" type="System.Configuration.NameValueSectionHandler,System"/>
  9.         </sectionGroup>
  10.         <sectionGroup name="WangYiSectionGroup">
  11.             <section name="WangYiSection" type="System.Configuration.NameValueSectionHandler,System"/>
  12.         </sectionGroup>
  13.         <sectionGroup name="SohuSectionGroup">
  14.             <section name="SohuSection" type="System.Configuration.NameValueSectionHandler,System"/>
  15.         </sectionGroup>
  16.     </configSections>
  17.     <SinaSectionGroup>
  18.         <SinaSection>
  19.             
  20.             
  21.             
  22.             
  23.         </SinaSection>
  24.     </SinaSectionGroup>
  25.     <QQSectionGroup>
  26.         <QQSection>
  27.             
  28.             
  29.             
  30.             
  31.         </QQSection>
  32.     </QQSectionGroup>
  33.     <WangYiSectionGroup>
  34.         <WangYiSection>
  35.             
  36.             
  37.             
  38.             
  39.         </WangYiSection>
  40.     </WangYiSectionGroup>
  41.     <SohuSectionGroup>
  42.         <SohuSection>
  43.             
  44.             
  45.             
  46.             
  47.         </SohuSection>
  48.     </SohuSectionGroup>
  49.     <system.web>
  50.         <compilation debug="true" targetFramework="4.0"/>
  51.     </system.web>
  52. </configuration>
复制代码
web.config
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册