本想前段时间就把本身经过QQ OAuth1.0、OAuth2.0协议进行验证而实现QQ登陆的心得及Demo实例分享给你们,可一直很忙,今天抽点时间说下OAuth1.0协议原理,及讲解下QQ对于Oauth1.0的认证开发。闲话多说了点,下面直接进入主题。html
一、OAuth的简述算法
OAuth(Open Authorization,开放受权)是为用户资源的受权定义了一个安全、开放及简单的标准,第三方无需知道用户的帐号及密码,就可获取到用户的受权信息,而且这是安全的。(我喜欢简单明了,这里没看懂,不要紧,接着往下面看)api
二、OAuth的原理安全
(流程图)服务器
我在图上分了四个步骤,下面是四步的讲解:app
第一步:用户访问第三方网站,好比:就是你须要使用QQ进行登陆的网站;学习
第二步:你点击QQ登陆后,第三方网站将会链接并进行请求,好比:你点击登陆后,第三方网站会跳转到QQ平台,提示你进行登陆;网站
第三步:你要进行受权第三方网站对你的信息访问的一个权限,好比:当你QQ登陆成功后,QQ会提示你,是否受权第三方Web访问你的用户基本信息或其余的资源信息,这时你点击受权便可;google
第四步:受权后,第三方Web便可访问你刚才受权的资源信息,好比:你的QQ基本信息-头像、昵称、性别等。加密
经过这个原理图示及讲解(图是手工制做,有点草),相信你们都了解了OAuth这个原理的一个基本流程,若看不明白,你能够不用学习制做OAuth了,开个玩笑。(这步后,你们知道什么原理了,但仍是没法知道OAuth到底是如何实现认证的,别急,接着往下看)
三、OAuth 1.0的认证流程
这里直接讲解OAuth 1.0协议的认证机制(OAuth 2.0会在下一节中讲述),虽然如今不少平台都是遵循OAuth 2.0,但仍是有开放OAuth 1.0平台的,好比:新浪微博、QQ1.0平台等。
在OAuth 1.0认证中会用到三个重要的Url:
第一个:Request Token Url,获取未受权的Token的Url;
第二个:User Authorization Url,请求用户对Token进行受权的Url;
第三个:Request Access Url,使用Token获取Access Token的Url。
上面是认证流程中用到的三个Url,在下面的流程示意图中会体现到,这是我讲解OAuth幻灯片的一页,直接截图下来进行讲解:
第一步:网站向认证平台请求一个未受权的Token,这个Request Token Url是前面说的第一个Url;
第二步:跳转至用户受权页面,提示用户进行登陆,并进行受权,返回得到已受权的Token,用到的User Authorization Url是前面说的第二个Url;
第三步:经过已受权的Token,向认证平台请求Access Token(数据令牌),用到的Request Access Url是前面说的第三个Url,返回后到这步整个认证流程就结束了,最后一步,是经过数据令牌等参数,调用接口获取用户信息,不彻底算认证 的流程。(我喜欢简洁明了,认证流程就是这样,相信经过图示及讲解都能明白,如有不明白之处请留言)
四、QQ OAuth1.0认证中Url的调用及参数的传递
前面讲了OAuth1.0的机制原理及认证流程,这篇文章着重讲解QQ OAuth1.0认证中Url的调用、各参数的传递、注意事项。而由于如今QQ开发平台上,已经不多能找到OAuth1.0认证的说明开发文档了,采用新 的2.0认证模式,因此简单讲述Url请求与返回参数的传递,并无很详细深刻地讲解,有什么问题你们可留言给我。
4.一、请求未受权的临时Token
新建一个页面为QQLogin.aspx,用来请求临时Token及跳转到用户受权页。下面是相关Url及参数介绍:
Request Token Url(请求临时Token的Url):http://openapi.qzone.qq.com/oauth/qzoneoauth_request_token
请求后,跳转至引导用户登陆的Url:http://openapi.qzone.qq.com/oauth/qzoneoauth_authorize
第一个Url请求参数包含以下内容:(红色为必填、绿色为选填)
参数 | 含义 |
---|---|
oauth_consumer_key | 申请QQ登陆成功后,分配给网站的appid |
oauth_nonce | 随机字符串,全部oauth_nonce请使用int型值。 |
oauth_timestamp | unix时间戳(从UTC时间1970年1月1日00:00:00到当前时刻的秒数,不一样语言中如何获取请google/baidu之)。 注意第三方服务器时间与腾讯服务器时间相差不能超过5分钟。 |
oauth_version | 版本号,请固定使用1.0 |
oauth_signature_method | 签名方法,请固定使用HMAC-SHA1。 |
oauth_signature | 签名值,用来提升传输过程参数的防篡改性。 签名值的生成详见【QQ登陆】签名参数oauth_signature的说明 |
oauth_client_ip | 用户的IP地址(可选),int型 |
返回的参数有:oauth_token(临时令牌)、oauth_token_secret(临时密钥对应的令牌)
第二个Url须要传递的参数为:
参数 | 含义 |
---|---|
oauth_consumer_key | 分配给网站的appid。 |
oauth_token | 上一步中,获得的oauth_token |
oauth_callback | 回调地址,即登陆并受权后返回到你网站上的地址。 |
返回的参数有:
参数 | 含义 |
---|---|
oauth_token | 已受权的token |
openid | 与APP通讯的用户key,它和QQ号码一一对应,访问OpenAPI时必需。 同一个QQ号码在不一样的应用中有不一样的OpenID。 |
oauth_signature | 签名值。若是网站使用这一步返回的openid,则须要按规则生成签名值,并与该签名值比对,以验证openid以及来源的可靠性。 比对时生成签名值的规则:使用HMAC-SHA1算法,源串:openid+openid的timestamp(串中间不要添加'+'符号);密钥:oauth_consumer_secret。 |
timestamp | openid的时间戳 |
oauth_vericode | 受权验证码。 |
4.二、请求Access Token数据令牌
上一步中,咱们写了一个回调地址,并顺利获得一些参数,下面就是拿这些参数来进行下一步操做,首先,获得数据令牌(只有拿到数据令牌才能够调用接口获取用户信息)。
Request Access Url(获取Access Token请求Url):http://openapi.qzone.qq.com/oauth/qzoneoauth_access_token
Url请求参数包含以下内容:
参数 | 含义 |
---|---|
oauth_consumer_key | 分配给网站的appid |
oauth_token | 已受权的的token,上一步返回的oauth_token |
oauth_nonce | 随机数 |
oauth_timestamp | unix时间戳(从UTC时间1970年1月1日00:00:00到当前时刻的秒数,不一样语言中如何获取请google/baidu之) |
oauth_version | 版本号,请固定使用1.0 |
oauth_signature_method | 签名方法,请固定使用HMAC-SHA1 |
oauth_signature | 签名值,用来提升传输过程参数的防篡改性。 签名值的生成详见【QQ登陆】签名参数oauth_signature的说明 |
oauth_vericode | 受权验证码,上一步返回的oauth_vericode |
oauth_client_ip | 用户的IP地址(可选),int型 |
返回的参数以下:
参数 | 含义 |
---|---|
oauth_token | 具备访问权限的access_token |
oauth_token_secret | access_token的密钥 |
openid | 在第一步和本步骤中都返回了openid。使用本步骤返回的openid,更为安全 |
timestamp | openid的时间戳 |
oauth_signature | 针对openid的签名值 |
4.三、经过Access token(数据令牌)调用API接口,获取用户受权资源
请求Url:http://openapi.qzone.qq.com/user/get_user_info (这里默认写的是get_user_info接口)
请求参数:
参数 | 含义 |
---|---|
oauth_consumer_key | 分配给网站的appid |
oauth_token | 上一步返回的oauth_token |
oauth_nonce | 随机数,int型 |
oauth_timestamp | unix时间戳(从UTC时间1970年1月1日00:00:00到当前时刻的秒数,不一样语言中如何获取请google/baidu之)。 |
oauth_version | 版本号,固定使用1.0 |
oauth_signature_method | 签名方法,固定使用HMAC-SHA1 |
oauth_signature | 签名值,用来提升传输过程参数的防篡改性。 签名值的生成详见【QQ登陆】签名参数oauth_signature的说明 |
openid | 上一步返回的openid。 |
oauth_client_ip | 用户的IP地址(可选),int型 |
好了,上面就是整个QQ OAuth1.0认证流程中Url参数的请求与返回说明,这OAuth1.0认证中,你会发现参数特别多,还有通过HMAC-SHA1加密、签名等操做,特别麻烦、繁琐,因此仍是最好推荐使用OAuth 2.0认证协议进行接口开发。
下面这篇文章是QQ登陆制做过程当中,公共返回码说明(包含1.0、2.0),供你们参考,看是哪一个阶段出错,而后对症下药,特别是参数的请求、传递是否正确,还有一个参数顺序、签名是否正确,这四点弄好,相信这个东西天然就实现了。
OAuth_QQ登陆_公共返回码说明:点击进入。
最后将本身开发制做的OAuth 1.0源代码分享给你们,代码分享:点击下载。
五、OAuth2.0的认证流程
在OAuth2.0的处理流程,主要分为如下四个步骤:
1)获得受权码code
2)获取access token
3)经过access token,获取OpenID
4)经过access token及OpenID调用API,获取用户受权信息
上面是流程的大概四个步骤,在下面的流程示意图中会获得体现,这是我制做的一个幻灯片的流程图(文章最后会附上制做的OAuth幻灯片分享给你们),这里就直接截图下来进行讲解:
第一步:首先直接跳转至用户受权地址,即图示 Request User Url ,提示用户进行登陆,并给予相关资源受权,获得惟一的Auth code,这里注意的是code只有10分钟的有效期,对于安全考虑,相对于OAuth 1.0省了一步获取临时的Token,而且有效期也进行了控制,比1.0认证简化了不少,并安全一些;
第二步:获得受权code后,这一步就是请求access token,经过 图示 Request access url ,生成获得数据Token;
第三步:经过Access Token请求OpenID,OpenID是用户在此平台的惟一标识,经过图示 Request info url 请求,而后获得OpenID;
第四步:经过第二步获得的数据Token、第三步获得的OpenID及相关API,进行请求,获取用户受权资源信息。(我喜欢简洁明了,OAuth2.0认证流程就是这样,相信经过图示及讲解都能明白,如有不明白之处请留言)
最后,分享本身关于OAuth1.0、2.0认证流程讲解的幻灯片,结合文章来看,你会更容易理解。
课件分享:点击下载 (麻烦保留博主信息,谢谢)