分享到 :

Qzone_OAuth_1.0认证简介

特别说明

目前QQ登录已支持OAuth2.0协议,OAuth2.0协议开发说明详见OAuth2.0开发文档

为了使认证流程更简单和安全,请升级为OAuth 2.0协议。升级方法详见OAuth1.0升级到OAuth2.0指引

 

1. 什么是“QQ空间OAuth认证”

OAuth认证: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容。OAuth是OpenID的一个补充,但是完全不同的服务。

QQ空间OAuth认证:QQ空间OAuth认证基于OAuth1.0协议,为了保护腾讯QQ空间用户的数据,所有第三方网站都需要通过OAuth认证机制来获得用户的授权。
本文档提供了QQ空间OAuth认证的总体处理流程,网站开发人员可以通过阅读本文档了解:
用户通过“QQ登录”登录网站并在网站上访问或修改他们在QQ空间上的数据(照片,日志,分享等)的整个处理流程。

目前QQ登录已支持OAuth2.0协议,采用OAuth2.0标准协议来进行用户身份验证和获取用户授权,相对于OAuth1.0协议,其认证流程更简单和安全。

因此,请使用OAuth 1.0协议的网站升级为OAuth 2.0协议,升级方法详见OAuth1.0升级到OAuth2.0指引

Tips

如果您想对OAuth开放标准进行扩展阅读,请参看:OAuth标准(英文) | OAuth维基百科(中文)

2. Qzone OAuth总体处理流程

Qzone OAuth总体处理流程如下:

起点: 用户在网站上点击“QQ登录”标识,使用QQ帐号登录网站

Step 1. 网站向Qzone发送request,请求临时token。

Step 2. Qzone接受请求,返回未授权的临时token。

Step 3. 网站引导用户到QQ登录窗口;用户输入用户名和密码,点击“登录”按钮后,网站向Qzone发送request,请求已授权的临时token。

Step 4. Qzone获取用户登录态;引导用户授权允许网站其QQ空间连接(仅在用户初次使用“QQ登录”登录网站时需要);返回已授权的临时token,并引导用户跳转回网站(该回调地址已在step3的请求中指定)。

Step 5. 网站向Qzone发送request,请求具有Qzone访问权限的access_token。

Step 6. Qzone接受请求,返回具有Qzone访问权限的access_token。

注:在step6和step7之间,网站可以将用户的QQ号码与网站帐号绑定。这一步不是必须的,一般来说该步骤仅针对已经有了自己帐号体系的网站。

Step 7. 网站调用QQ登录OpenAPI向Qzone发送request,请求访问或修改Qzone受保护的资源(例如用户资料,日志,相册,说说等信息)。

终点: Qzone接受请求,返回step7中请求的资源或执行对资源的修改。

下面的总体流程图演示了上文所描述的7个步骤:

Qzone_OAuth_process_1.png

Step1:网站向Qzone发送request,请求临时token

将您的请求发送到:
http://openapi.qzone.qq.com/oauth/qzoneoauth_request_token

请求参数请包含如下内容:

参数 含义
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 签名值,用来提高传输过程参数的防篡改性。 

签名值的生成详见签名参数oauth_signature的说明

oauth_client_ip 用户的IP地址(可选),int型

 

Step2:Qzone接受请求,返回未授权的临时token

如果step1中请求成功,将返回如下内容:

参数 含义
oauth_token 未授权的临时token
oauth_token_secret 未授权的临时token对应的密钥

Step3:网站引导用户到QQ登录窗口,获取已授权的临时token

将请求发送到:
http://openapi.qzone.qq.com/oauth/qzoneoauth_authorize

请求参数请包含如下内容:

参数 含义
oauth_consumer_key 申请QQ登录成功后,分配给网站的appid
oauth_token 未授权的临时token,请使用上一步中返回的oauth_token
oauth_callback 回调地址。在用户授权成功后,会从QQ登录页面跳转回这里指定的回调地址

Step4:Qzone引导用户跳转到第三方应用

如果step3请求成功,在用户授权成功后会跳转到step3中指定的回调地址,并在参数后面附带如下值:

参数 含义
oauth_token 已授权的临时token
openid 与APP通信的用户key,它和QQ号码一一对应,访问OpenAPI时必需。 

同一个QQ号码在不同的应用中有不同的OpenID。

注意:

在step4和step6都返回了openid。

step4:不建议使用本步骤中返回的openid,如果使用则一定要做校验。校验规则即下面一行的比对签名值。

step6:优点是更安全,第三方发起的后台操作。

oauth_signature 签名值。如果网站使用这一步返回的openid,则需要按规则生成签名值,并与该签名值比对,以验证openid以及来源的可靠性。 

比对时生成签名值的规则:使用HMAC-SHA1算法,源串:openid+openid的timestamp(串中间不要添加'+'符号);密钥:oauth_consumer_secret。

timestamp openid的时间戳
oauth_vericode 授权验证码。

Step5:网站请求具有Qzone访问权限的access_token

将请求发送到:
http://openapi.qzone.qq.com/oauth/qzoneoauth_access_token

请求参数请包含如下内容:

参数 含义
oauth_consumer_key 申请QQ登录成功后,分配给网站的appid
oauth_token 已授权的的临时token,请使用上一步返回的oauth_token
oauth_nonce 随机字符串
oauth_timestamp unix时间戳(从UTC时间1970年1月1日00:00:00到当前时刻的秒数,不同语言中如何获取请google/baidu之)。 

注意第三方服务器时间与腾讯服务器时间相差不能超过5分钟。

oauth_version 版本号,请固定使用1.0
oauth_signature_method 签名方法,请固定使用HMAC-SHA1
oauth_signature 签名值,用来提高传输过程参数的防篡改性。 

签名值的生成详见签名参数oauth_signature的说明

oauth_vericode 授权验证码,请使用上一步返回的oauth_vericode
oauth_client_ip 用户的IP地址(可选),int型

Step6:Qzone返回具有Qzone访问权限的access_token

如果step5中请求成功,将返回如下内容:

参数 含义
oauth_token 具有访问权限的access_token
oauth_token_secret access_token的密钥
openid 与APP通信的用户key,它和QQ号码一一对应,访问OpenAPI时必需。 

同一个QQ号码在不同的应用中有不同的OpenID。

注意:

在step4和本步骤中都返回了openid。建议使用本步骤返回的openid,更为安全

timestamp openid的时间戳
oauth_signature 针对openid的签名值

Step7:网站调用OpenAPI,访问或修改空间受保护的资源

将请求发送到某个具体的OpenAPI

请求参数请包含如下内容:

参数 含义
oauth_consumer_key 申请QQ登录成功后,分配给网站的appid
oauth_token 具有访问权限的access_token,请使用上一步返回的oauth_token
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的说明

openid 请传入上一步返回的openid。
oauth_client_ip 用户的IP地址(可选),int型

3. 代码实现

从上面的流程图以及流程描述中可以看到:Step1,3,5,7是需要网站参与的。

开发者需要根据腾讯提供的UI规范,请求说明,接口说明进行UI和代码的开发。

由于整个OAuth处理流程比较复杂,我们提供了开发攻略,将UI规范,请求说明,接口说明,以及示例代码等融合在step by step的描述中,希望可以指引开发者,降低开发门槛。

 

返回顶部