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

看到国内微博兴起.各大门微博都提供了统一的OAuth认证
开始有想法做一个统一访问接口了.到时候就可以利用各大门户的注册用户来为我们服务
从而也使得最终用户不用每个网站都要去注册一个帐号.还有安全性的问题了
从开始一时兴趣.到专心的架构,把博客园有关OAuth认证的文章都看了一下.
从不知.到了解,到熟悉再到自己造轮子.
利用休息时间.自己终于写好了国内四大门户的三大微博接口.
由于搜狐的文档还没有看.用一般的方式去认证老是失败.等有时间再完工
现在只有新浪,腾迅,网易的认证成功了
接下来.先上图.有图有真相.这是我的架构图 新浪微博接口,新浪,腾迅,网易微博OAuth统一认证接口实现
OAuth项目写了几个公共接口分别是 IOAuthConfig这个是得到web.config的配置信息接口
namespace OAuth { public interface IOAuthConfig { /// /// 得到AppKey /// /// string GetAppKey(); /// /// 得到AppSecret /// /// string GetAppSecret(); /// /// 得到回调URL /// /// Uri GetCallBackURI(); /// /// 得到请求类型 /// GET,POST,HEADER /// /// OAuthEnum.RequestType GetRequestType(); } }

IOAuthMode这个接口得对OAuth认证的参数接口 这里接口比较多
namespace OAuth { public interface IOAuthMode { /// /// 得到回调地址 /// /// OAuthParameter GetOAuthCallBack(); /// /// 得到申请的ConsumerKey /// /// OAuthParameter GetOAuthConsumerKey(); /// /// 设置随机字符串 /// ///
void SetOAuthNonce(string OAuthNonceString); /// /// 得到随机字符串 /// /// OAuthParameter GetOAuthNonce(); /// /// 得到签名方式 /// /// OAuthParameter GetOAuthSignatureMethod(); /// /// 设置时间戳 /// ///
void SetOAuthTimeStamp(string OAuthTimeStampString); /// /// 得到时间戳 /// /// OAuthParameter GetOAuthTimeStamp(); /// /// 得到OAuth版本 /// /// OAuthParameter GetOAuthVersion(); /// /// 设置签名字符串 /// void SetOAuthSignature(string OAuthSignatureString); /// /// 得到签名字符串 /// /// OAuthParameter GetOAuthSignature(); /// /// 设置OAuthToken /// void SetOAuthToken(OAuthParameter OAuthToken); /// /// 得到OAuthToken /// /// OAuthParameter GetOAuthToken(); /// /// 设置OAuthTokenSecret /// void SetOAuthTokenSecret(OAuthParameter OAuthTokenSecret); /// /// 得到OAuthTokenSecret /// /// OAuthParameter GetOAuthTokenSecret(); /// /// 设置OAuthVerifier /// ///
void SetOAuthVerifier(OAuthParameter OAuthVerifier); /// /// 得到OAuthVerifier /// /// OAuthParameter GetOAuthVerifier(); /// /// 得到接口提供商 /// /// OAuthEnum.OAuthInterface GetOAuthInterface(); } }

IOAuthRequestURL这个接口是对请求地址的接口
namespace OAuth { public interface IOAuthRequestURL { /// /// 获取未授权的Request Token /// /// Uri GetRequestTokenURL(); /// /// 请求用户授权Token /// /// Uri GetRequestOAuthTokenURL(); /// /// 获取授权过的Access Token /// /// Uri GetRequestAccessTokenURL(); } }

然后各个微博都实现这里几个接口(看到图片就知道.每个微博都实现了这三个接口)
然后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
然后就可以用这个调用相关接口了
新浪微博接口,新浪,腾迅,网易微博OAuth统一认证接口实现
protected void imgBtnSina_Click(object sender, ImageClickEventArgs e) { SinaOAuthMode OAuthMode = new SinaOAuthMode(); OAuthBase Base = new OAuthBase(new SinaOAuthRequestURL(), new SinaOAuthConfig(), OAuthMode); OAuthMode = (SinaOAuthMode)Base.RequestToken(); string res = string.Format("{0}:{1}&{2}:{3}", OAuthMode.GetOAuthToken().ParameterName, OAuthMode.GetOAuthToken().ParameterValue, OAuthMode.GetOAuthTokenSecret().ParameterName, OAuthMode.GetOAuthTokenSecret().ParameterValue); labMsg.Text = res; string RequestOAuthTokenURL = Base.GetAccessTokenURL().ToString(); Session["OAuthMode"] = OAuthMode; Page.ClientScript.RegisterStartupScript(GetType(), "W_CallBack", ""); }

点击按钮
private void SinaCallBack() { SinaOAuthMode Mode = (SinaOAuthMode)Session["OAuthMode"]; Mode.SetOAuthToken(new OAuthParameter("oauth_token", Request.QueryString["oauth_token"])); Mode.SetOAuthVerifier(new OAuthParameter("oauth_verifier", Request.QueryString["oauth_verifier"])); OAuthBase Base = new OAuthBase(new SinaOAuthRequestURL(), new SinaOAuthConfig(), Mode); Mode = (SinaOAuthMode)Base.RequestAccessToken(); Session["OAuthMode"] = Mode; }
回调页面
Tags:  新浪微博发布接口 新浪微博分享接口 新浪微博登录接口 新浪微博登陆接口 新浪微博接口

延伸阅读

最新评论

发表评论