[腾讯社区开放平台].NET SDK基于New BSD协议开源。[腾讯社区开放平台]介绍开放授权协议-OAuth

by admin on 2018年9月19日

“QQ登录”使用户能使用QQ账号一键登录接入网站,大大降低了挂号、登录的妙方。借助大的QQ用户群,给第三正在网站带重新多新用户。已报到用户还可以以于第三方网站发布、分享的信就是经常一头到QQ空间,使网站内容通过好友关系取得更加的不胫而走。

betway必威 1OAuth
(开放授权)
是一个绽放标准,允许用户授权第三正在网站访问他们存储于另外的劳务提供者上的消息,而未需用用户称与密码提供于第三着网站还是分享他们数据的具有内容。OAuth是OpenID的一个补偿,但是完全两样的劳务。

腾讯社区开放平台.NET
SDK是冲腾讯社区开放平台的OAuth登录文档和API文档
使用C#支出之.NET
4.0之一个储藏室,目前总体兑现了腾讯社区开放平台的兼具接口。可以加速而的社区对接到腾讯社区开放平台,免去大量底再次的调剂开发的工夫,所以我是盖New
BSD协议创建的开源项目,各位有相同需的各位同事参与建设正在一个色,项目的托管地址是http://qqconnect.codeplex.com/。

OAuth,一个为人口还要爱而恨的征协议,它于众主流的应酬网站(SNS)与网络服务打开了封就老的认证大门,它为是于网络上公然个人还是私人信息
(private data)
前极要紧的验证管道有,重要的凡,在此协议下,所有公开给外界的民用数据会受两个阶段的护卫,OAuth
保障用户可以在应用程序要求数前由用户做肯定授权,只有授权过之资源才会盛开给应用程序读取,而且
OAuth
公开的性状,可以被应用程序在极少量程序代码的修改下,移植到不同的劳务持续采用,而
OAuth
协议也给服务端精确的操纵而开之服务,并且提供使用者授权的管道以吃使用者能随便支配授权也,而且客户端应用程序只要动
HTTP 协议即可使OAuth
服务。那干什么我会说以易而恨吗?因为它们真的不容易使用,会受想以它的开发人员头发被抓捕掉好几百到底,最近2周当折腾腾讯开放社区的QQ登陆,QQ登陆也是使OAuth
,具体参看
【QQ登录】OAuth登录文档,开始的下以的凡DotnetOpenauth(网址为:
http://www.dotnetopenauth.net,可惜被堵了,需要摸索个阶梯),一直进展无下,问题的故纵然是腾讯开放社区的QQ登陆的OAuth不是雅专业,无奈之衍不得不根据QQ登陆文档重头构建一个验证库,我把她托管在codeplex上,地址是http://qqconnect.codeplex.com/,所有的效应还非得,欢迎有同等需要的各位同学在。

腾讯社区开放平台.NET
SDK使得你调用腾讯社区开放平台的REST接口非常容易,你只是需要到http://connect.opensns.qq.com/apply
申请到要的consumer key和consumer
secret,在公的提请经过了腾讯社区开放平台的审后即可以赢得。这个可怜的关键特点如下:

OAuth 是 Open Authorization 的缩写,由 2006
年起草的初认证标准,当时产业界还有部分不比的合计,像是 Open
ID,Shibboleth,WS-Federation 等签订,这些还于叫做 Central
Authentication Service
(中央验证服务),只是这些协议利用上都稍好,有些有明确的软件平台限制,有些则是使作某些套件等,比如微软的WIF,OAuth
则是比晚起的劳动,但她因此起来简单,又相当于 HTTP
的规范,任何可以起 HTTP 通讯方式的阳台以及函式库都得以应用,它吗酷常多配
Open ID 使用,所以当一部分特大型网络服务平台 (ex: Google, Yahoo) 会看到 Open
ID + OAuth 的格式,但 OAuth
本身也不无证明能力,不过它们是由劳务端来做验证。Open ID
亦未是准系列和之重点,所以我们只会于即时系列文中看到 OAuth 的应用方法。

  • 装进好了腾讯社区开放平台的OAuth协议看腾讯社区开放平台的REST接口
  • 和腾讯社区开放平台的接口保持同(目前只有一个接口,将来定会没完没了增加)

那 OAuth 是怎么运作的吧?虽然各个大网站还发提供 OAuth
的操作流程,但基本上会是盖下图的流程也按照:

是库房使用Visual Studio 2010跟C#
3.0构建的,主要扩展以及用及脚的开源库:

betway必威 2

  1. DotnetOpenauth:DotNetOpenAuth
    是一个 C# 开发包,用以实现 OpenID 2.0 的供者、中继方(Relying
    Party)、OAuth使用者和OAuth服务提供者;同时支持 InfoCard Selector
    。OAuth协议客户端的贯彻上参照了这个路的代码。
  2. Jayrock:Jayrock是一个LGPL的开源的软件,实现了JSON和JSON-RPC,支持微软ASP.NET框架。具体可以参考文章:Jayrock:
    JSON and JSON-RPC for
    .NET

及图自 http://oauth.net/core/1.0/#anchor9 

面我们于大层次了解了之SDK的实现原理,下面我们介绍如何利用这SDK来跟腾讯社区开放平台进行互。SDK主要发生个别个待关怀之类QzoneSDK.Context.QzoneContext

大体上会见分为三只次:

和 QzoneSDK.Qzone。

  1. 客户端应用程序向服务要求一个 Request Token,这个 Token
    会因此来识别应用程序要求存取的对话。

  2. 客户端应用程序开启浏览器 (Desktop Application)
    或由于劳动导向到授权的网页 (Web
    Application),由使用者决定是否授权,若使用者决定授权时,客户端应用程序会博得一个
    Verifier Token,这个 Token 会在稍后往劳动要求看权限。

  3. 客户端应用程序向服务交由 Request Token 与 Verifier
    Token,服务在印证后核发 Access Token,这个 Token
    会在应用程序每次向服务要求资源时,由客户端应用程序提交以证实权限。

先是我们成【QQ登录】OAuth登录文档来证实。Qzone
OAuth总体处理流程里共有七独步骤,从下面的完整流程图中得望:

那服务是如何决定客户端应用的凡 OAuth 协议时,其实特别简单,是透过 HTTP
Header 中的 Authorization 标头数据,应用程序在 HTTP 要求丁在 OAuth
oauth…. 的音,服务会拆解这个标头中的 OAuth
数据开展检查为证实客户端的权杖,例如下面的 HTTP Request 就是杰出的
OAuth调用:

betway必威 3

POST /accounts/OAuthGetRequestToken HTTP/1.1

左边:为老三正值网站要做的事情。在每个绿色的方框里,标明了第三正应该调用的接口,接口主要力量以及逻辑见Qzone
OAuth接口说明。

Host: www.google.com

右边:为Qzone接收到第三正在使用发过来的乞求后召开的事情。第三在呼吁的发送地址及应涵盖的参数在对接下的单步详解中开展了求证

Content-Type: application/x-www-form-urlencoded

经类QzoneSDK.Context.QzoneContext带齐你申请的oauth_consumer_key
(对应Qzone的appid)和oauth_consumer_secret
(对应Qzone的appkey)到腾讯社区开放平台获取到Request
Token,然后把tokenKey和tokensecret保存至Session里,后续要运用。示例代码如下:

Authorization: OAuth

string key = ConfigurationManager.AppSettings[“ConsumerKey”];

oauth_consumer_key=”example.com”,

string secret = ConfigurationManager.AppSettings[“ConsumerSecret”];

oauth_signature_method=”RSA-SHA1″,

var context = new QzoneSDK.Context.QzoneContext(key, secret);

oauth_signature=”wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D”,

//Get a Request Token

oauth_timestamp=”137131200″,

var callbackUrl = ConfigurationManager.AppSettings[“callbackUrl”];
//”/qzone/account/QQCallback.aspx”;

oauth_nonce=”4572616e48616d6d65724c61686176″,

var requestToken = context.GetRequestToken(callbackUrl);

oauth_version=”1.0″

//request token, request token secret 需要保存起来

oauth_callback=”http://www.example.com/showcalendar.html”

//在demo演示着,直接保存在全局变量中.真实情况需要网站自己处理

成套 OAuth 最困顿的部份就是错过打出明白这些在 OAuth 中确定之参数,而及时为是运用
OAuth
协议开发客户端应用程序的太可怜门坎,只要经过是门槛后,之后的服务走访就变得要命简单易行。

Session[“requesttokenkey”] = requestToken.TokenKey;

下面来证实这些参数的意思及用法。OAuth
使用上无限难知晓以及测试的,莫过于这些 OAuth 的参数,尤其是在 OWASP 的 Web
Security Report
(https://www.owasp.org/index.php/Main_Page)之下,又生 Improper Error
Handling 的安全漏洞问题,因此当测试 OAuth 时,最轻吃的苦就是独知
HTTP 400 (Bad Request) 或 HTTP 401
(Unauthorized),有些服务还会提供一些谬误讯息,但也发一些还不提供的,而且就是出供,也非肯定就便可发现及题目在哪
(例如: Signature
Invalid),往往都使做过多底实验才确实找到题目在哪,我于测试 QQ登陆 的
OAuth 时便吃了不少之苦头…

Session[“requesttokensecret”] = requestToken.TokenSecret;

  • oauth_consumer_key:这是由于服务所提供的应用程序密钥,要于历次 HTTP
    Request 中附加到 Authorization 标头中。
  • oauth_consumer_secret:这是由于服务提供的应用程序签章密钥,会因此来计量
    siguature 用。
  • oauth_token:由劳动在验证后,核发的 Request Token 或 Access
    Token,要在每次 HTTP Request 中附加到 Authorization 标头中。
  • oauth_token_secret:由服务证后,核发的签章密钥,会以及
    oauth_consumer_secret 一起从而来计算 signature 用。
  • oauth_timestamp:由 UTC 时间 1970/1/1 00:00:00
    起及这时光所经过的秒数,但为产生一对开发人员使用 64
    位的随意数字来代用。
  • oauth_nonce:64 位的自由字符串 (64bit random
    string),这个说法未易于了解,不过好一直由 oauth_timestamp
    转换而得。
  • oauth_signature_method:决定 signature 使用的算法,目前 OAuth 1.0
    中定义了 HMAC-SHA1,RSA-SHA1 以及 PLAINTEXT 三栽格式,但貌似会动
    HMAC-SHA1 较多,Google OAuth Playground 默认的算法是 RSA-SHA1。
  • oauth_signature:这是最爱失误的一样码资料,它会依据三单等级的
    Request 数据,使用 oauth_signature_method 决定的算法,使用
    oauth_consumer_key 以及 oauth_token_secret 计算的签章值,但如果
    Request 的数额有误时,signature
    签章值也会误,而且是除错(参数顺序错误吧不行…)。
  • oauth_version:指定 OAuth 的版价值,目前为 1.0。
  • oauth_verifier:在 Verifier 阶段时,由劳动核发的检核码,QQ登陆的OAuth的悲剧在此地,这个参数名叫吃反化了oauth_vericode
  • oauth_callback:由客户端应用程序设定,服务回呼时利用的网址,若应用程序是
    Desktop Application 时,此值可要是为 oob
    (Out-Of-Box),此时劳动会为此不同之章程来进展使用者授权等。

var authenticationUrl = context.GetAuthorizationUrl(requestToken,
callbackUrl);

这些参数中不过亟需领取的,莫过于 oauth_signature 了,它需要事先得 Request
的参数数据,再用 consumer key 和 token secret 进行哈希计算 (使用
HMAC-SHA1 恐怕 RSA-SHA1 算法) 后时有发生的签约值密钥。Request
参数数据被叫作基础字符串 (base string),基础字符串是由 HTTP Method,
Request URL 以及 Normalized Parameters 组合,它的格式是
{HTTP_METHOD}&{URL}&{PARAMETERS},HTTP Method 可以是 GET 或 POST,URL
会随要求不同而具不同,而 Normalized Parameters
是均等栽标准的参数清单,它而入两只尺码:

Response.Redirect(authenticationUrl);

  1. 总得要是 Lexicographical byte
    order
    的依次,简单的游说,就是如果因字母逐一判断排序,如果当参数中的 key
    值顺序相同时,就使于对 value 值。

  2. 每个参数还如坐 key=value 方式做。

  3. 每个值都使由此 UrlEncode() 处理了,这个 UrlEncode()
    是一个特意的本子,我们于程序设计时再说明。

用户在腾讯社区开放平台上授权行使后会导向到公的网站,也即是上图的老三步,在门上述的callback
的页面上便可得上图第四步之参数,利用上述获得的参数调用QzoneSDK.Qzone进行第五步调用,就得抱AccessToken,这个AccessToken,目前access_token(及其secret)是长期有效的,和某一个openid对应,目前足支撑线下取得该openid的音信。

比如 Request Token 阶段,必须使起 oauth_consumer_key,
oauth_signature_method, oauth_version, oauth_callback, oauth_nonce,
oauth_siguature 与 oauth_timestamp 等参数,在处理 Normalized
Parameters 时,则肯定要是动用下列顺序排序:

if (Request.QueryString[“oauth_vericode”] != null)

  • oauth_callback=xxx
  • oauth_consumer_key=xxx
  • oauth_nonce=xxx
  • oauth_signature_method=xxx
  • oauth_timestamp=xxx
  • oauth_version=xxx

{

设若 Normalized Parameters 也确定,不可知包含
oauth_signature,所以参数中莫得以发 oauth_signature。下列字符串就是
base string 的范例(有分公司,真实的情形是一整行):

var requestTokenKey = Session[“requesttokenkey”].ToString();

GET&http%3A%2F%2Fopenapi.qzone.qq.com%2Foauth%2Fqzoneoauth_request_token&
oauth_consumer_key%3D200001%26oauth_nonce%3D1606024431%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1299143758%26oauth_version%3D1.0

var requestTokenSecret = Session[“requesttokensecret”].ToString();

以 base string 组合出后,即可使 .NET 的
System.Security.Cryptographics 命名空间被之 HMACSHA1 类,使用
ComputeHash() 计算签名值密钥,并设定也 oauth_siguature 参数,作为 OAuth
验证信息的签用。

var verifier = Request.QueryString[“oauth_vericode”];

string key = ConfigurationManager.AppSettings[“ConsumerKey”];

string secret = ConfigurationManager.AppSettings[“ConsumerSecret”];

QzoneSDK.Qzone qzone = new QzoneSDK.Qzone(key, secret, requestTokenKey,
requestTokenSecret, verifier);

//这里需要拿qzone.OAuthTokenKey, qzone.OAuthTokenSecret, qzone.OpenID
存储起来用于末端的API的造访

QzoneSDK.Qzone qzone2 = new QzoneSDK.Qzone(key, secret,
qzone.OAuthTokenKey, qzone.OAuthTokenSecret, string.Empty, true,
qzone.OpenID);

Session[“qzonesdk”] = qzone2;

qzone2 = Session[“qzonesdk”] as QzoneSDK.Qzone;

var currentUser = qzone2.GetCurrentUser();

var user = (BasicProfile)JsonConvert.Import(typeof(BasicProfile),
currentUser);

if (null != user)

{

this.Nickname.Text = user.Nickname;

this.Figureurl.Text = user.Figureurl;

}

}

上述代码还以身作则调用腾讯开放社区目前唯一的一个API (
get_user_info),通过Jayrock库将Json数据易为仓库中定义的用户登录数的实业BasicProfile。

类型的下载地址:http://qqconnect.codeplex.com/releases/view/65042 

项目文档:腾讯社区开放平台教程.pdf

Demo: http://www.dotnetting.cn/qzone/Account/Login.aspx

QQ群:80767552

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图