前言
所谓OAuth(即Open Authorization,开放授权),是一个开放标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方应用。而OAuth2.0是OAuth协议的下一版本,但不向后兼容OAuth 1.0。
Auth2.0认证流程
1. 跳转到第三方账号登录授权页,由用户输入用户名+密码进行授权,获取授权码auth_token; |
token有效期及作用说明:auth_token(授权码):仅能使用一次即失效(类似于CAS单点登录中的票据ticket),
用于获取access_token和refresh_token;
access_token(访问码):有效期一般为2小时(自行定义),
用于作为调用开放平台接口凭证;
refresh_token(刷新码):有效期一般为3个月(自行定义),
当access_token失效后,通过refresh_token获取一个新的refresh_token;
ps:如果不需要用户进行第三方登录授权的,则可以省略步骤1,直接通过用户名+密
码获取access_token和refresh_token;步骤1主要是针对类似第三方授权登录的场景,例如:QQ第三方授权登录等;
QQ网页版OAuth2.0授权登录
现在很多web网站登录页,都有第三方账号登录。例如:QQ,淘宝(taobao),微信(wechat),百度(baidu),新浪(sina) 等第三方账号授权登录;下面以QQ为例,介绍第三方账号授权登录的实现过程。
点击QQ第三方登录,跳转到QQ授权页面
用户授权成功后,浏览器重定向到redirect_uri?code=xxx
第三方应用服务器拿到授权码code之后,根据授权码获取access_token和refresh_token
第三方应用服务器根据access_token调用QQ开放平台接口,获取用户信息及openId等信息
第三方应用服务器判断该openId是否绑定过自身账号,如果没有则跳转到绑定页面,有则直接根据绑定账号的用户名+密码登录第三方应用系统
QQ授权登录的坑
腾讯开放平台针对web和app提供了两种接入方式:网站应用和移动应用,但是有一个比较坑爹的地方是,同一个QQ账号通过网站应用和移动应用返回的唯一标识是不一样的。这样就会导致同一个QQ账号在我们应用中绑定了多个账号,产生数据的错乱。
解决方式:情况1:QQ授权登录是新功能,没有冲突数据入库
移动端和web端都以网站应用接入,当在移动端点击"QQ登录"时,
跳到web浏览器(html5页面)进行授权
或者联系腾讯技术支持,将网站应用和移动应用之间关系打通,并选择其中一个为"主",
另一个为"从";这样如果通过"从"获取用户唯一标识,返回的都是"主"的用户唯一标识。
情况2:QQ授权登录已经使用且有冲突数据入库
联系腾讯技术支持,将网站应用和移动应用之间关系打通,并选择其中一个为"主",
另一个为"从";这样如果通过"从"获取用户唯一标识,返回的都是"主"的用户唯一标识。
冲突数据兼容处理:
在两个应用打通之前,需要确定哪一个为"主",哪一个为"从",
并且要把之前通过"从"绑定的唯一标识导出来,交给腾讯技术支持,
他们会返回这部分"从"唯一标志和"主"唯一标志之间的一一映射关系的。
这样我们就可以对程序进行兼容处理;
ps:腾讯只支持两个应用之间的打通,不支持多个应用之间的互通,也就是说三个以上应用不能互通,只能大家都以一个为主,进行两两打通(比如A,B,C三个应用,共用一套账户体系,要实现QQ第三方账号登录,解决方案是比如大家都以A为主,A与B打通之后,然后A再与C打通);
相比于QQ开放平台,wechat微信则设计的更为合理,除了有一个应用内唯一Id(openId),同时还有个全局唯一Id(unionId:即针对所有应用,同一个微信账号返回的unionId都是相同的),这样unionId就可以保证同一个应用在移动应用和网站应用都返回相同的Id,从而保证不会出现同一个Id绑定多个第三方应用账号的情况。