1、 web网站认证
用户从第三方web site页面,302跳转至账号中心
输入参数:appkey、回跳地址、认证类型
https://account.aliyun.com/oauth/authorize?oauth_consumer_key=YOUR_APP_KEY&oauth_callback=YOUR_CALLBACK_URL&response_type=code
用户在账号中心登陆授权后,跳回第三方web站点
返回参数:授权临时code
https://www.aliyun.com/oauth_callback?code=CODE_GENERATE_BY_ACCOUNT
第三方web server调用账号中心api,换取accessToken
输入参数:授权临时code、appkey, appsec,回调地址,授权类型
返回参数:accessToken, refreshToken, expireTime
https://account.aliyun.com/oauth/access_token?code=CODE_GET_BEFORE&grant_type=authorization_code&oauth_consumer_key=YOUR_APP_KEY&oauth_consumer_secret=YOUR_APP_SEC&oauth_callback=YOUR_CALLBACK_URL
第三方web server使用accessToken调用账号中心api
输入参数:accessToken
返回参数:业务数据
https://account.aliyun.com/openapi/id/load?oauth_token=YOUR_ACCESS_TOKEN
2、 Javascript Client认证 (ImplicitGrant)
从第三方网站页面302跳转至账号中心授权页面
输入参数:appkey,回调地址,认证类型
https://account.aliyun.com/oauth/authorize?oauth_consumer_key=YOUR_APP_KEY&oauth_callback=YOUR_CALLBACK_URL&response_type=token
账号中心直接带上accessToken回跳第三方网站
输出参数:accessToken, expireTime
https://www.aliyun.com/oauth_callback#oauth_token=ACCESS_TOKEN&expires_in=EXPIRE_TIME
Javascript程序获取accessToken,调用账号中心API
var token = window.location.hash;
var script = document.createElement(‘script’);
script.src = ‘https://account.aliyun.com/openapi/id/load?oauth_token=’ + token;
document.body.appendChild(script);
返回jsonp格式response,例如:var data = {‘v1’:’xx’}
3、 用户名密码认证
第三方web server调用账号中心API,获取accessToken
输入参数:用户名、密码、appkey、appSec、认证类型
输出参数:accessToken、expireTime、refreshToken
https://account.aliyun.com/oauth/[email protected]&password=XXXX&oauth_consumer_key=APP_KEY&oauth_consumer_secret=APP_SEC&grant_type=password
第三方web server使用accessToken调用账号中心API
输入参数:accessToken
返回参数:业务数据
https://account.aliyun.com/openapi/id/load?oauth_token=YOUR_ACCESS_TOKEN
新浪微博 |
人人网 |
淘宝 |
腾讯微博 |
|
web网站认证 |
支持 |
支持 |
支持 |
支持 |
js client认证 |
支持 |
支持 |
支持 |
支持 |
用户名密码认证 |
支持 |
支持 |
不支持 |
不支持 |
refresh token |
不支持 |
支持 |
支持 |
支持 |
oauth api通道 |
https |
https |
https |
https |
open api 通道 |
https |
http |
https |
https |
调用API需要签名 |
不用 |
需要 |
不用 |
不用 |
2.0继续沿用oauth核心理念,就是用户只能在资源所在站点输入用户名密码,任何第三方站点是无权获取用户密码的。
最本质的变化是从oauth1.0走http协议到oauth2.0的https协议,从而导致了认证应用和用户授权的方式改变,体现在API调用中oauth协议参数上。
附加改变是增加支持了oauth1.0中没有涉及的客户端场景:纯页面js脚本、纯客户端。
具体要点:
1、2.0只支持https通道,参数更简洁。省去了oauth_timestamp,oauth_nonce参数。这两个参数在1.0协议中,主要用于防止重放攻击,而https下不存在这个问题。
2、调用API时省去了复杂的签名算法。在2.0中,因为走https通道,accessToken, appKey, appSec在调用API时,是可以直接作为参数传递给server端的。因此无需通过复杂的签名算法保证appSec和tokenSec的保密性。
3、AccessToken Refresh机制:因为在调用OpenAPI时,accessToken是作为参数传递调用的,为了安全起见,对其做了失效处理。失效后,拿refreshToken重新获取有效的accessToken。RefreshToken是用户认证后,server对server获取的值,不会在网络上传输,具有一定的保密性和可靠性。
4、固定callback:应用注册时,会告之固定的一个callbackURL,不可变。在oauth的任意步骤中,需要回跳第三方服务器时,一定是回跳到当初注册的那个地址去的。增加了安全性。
6各个厂商API认证方式
淘宝TOP |
同时支持两种认证方式 http通道:TOP认证(将由oauth2.0取代)注1 https通道:oauth2.0 |
新浪微博 |
同时支持oauth1.0和2.0。 但是在弱化1.0版本(网站上已经没有1.0版本文档的明显入口了),部分新接口只支持2.0版本oauth认证,且提供接口/oauth2/get_oauth2_token将oauth1.0的token换成2.0的token 但是weibo 的oauth2.0没有refresh token的概念,accessToken失效后,用户必须重新授权。过期时间根据应用级别,从7天到90天不等。 |
人人 |
基于oauth2.0上,自己的一套认证逻辑 通过oauth2.0协议方法,获取用户的accessToken授权 在调用API时,accessToken作为参数传递,并且需要用appSec对整串参数做MD5签名 走oauth2.0认证的接口,都是https通道 而API调用通道,都是http,所以仍然需要appSec签名 |
腾讯QQ |
同时支持oauth1.0和2.0,还有自定义的OpenID&OpenKey鉴权 oauth协议1.0和2.0都支持的比较规范 附带的,通过在用户登录授权后,会额外返回OpenID&OpenKey参数,标识用户的ID和密钥,通过OpenKey做签名算法也可以访问API |
注1:TOP认证是类似于oauth1.0的认证,需要302跳转到taobao.com进行用户登陆授权,获取sessionKey,接着用appSec+sessionKey进行API参数的md5|hmac算法签名调用API。并且TOP认证加入了oauth2.0中的refresh token概念,sessionKey是有生命期的,可以通过refreshToken去延长生命期