平臺技術(shù)-用戶授權(quán)介紹
登錄授權(quán)
如果您的應(yīng)用和淘寶開放平臺對接時需要獲取用戶隱私數(shù)據(jù)(如商品、訂單等),為保證用戶數(shù)據(jù)的安全與隱私,您的應(yīng)用需要取得用戶的授權(quán),即獲取訪問用戶數(shù)據(jù)的授權(quán)令牌 Access Token (即原來的SessionKey)。這種情況下,您的應(yīng)用需要引導(dǎo)用戶完成使用淘寶帳號“登錄授權(quán)”的流程。該流程采用國際通用的OAuth2.0標(biāo)準(zhǔn)協(xié)議作為用戶身份驗(yàn)證與授權(quán)協(xié)議,支持網(wǎng)站、手機(jī)客戶端、桌面客戶端。
目前淘寶OAuth2.0服務(wù)支持采用兩種方式獲取Access Token(授權(quán)令牌),即 Server-side flow 和 Client-side flow ,詳見如下說明。
注:Taobao ID(淘帳號)產(chǎn)品不得用于阿里巴巴集團(tuán)非官方渠道為淘寶買家提供淘寶會員類服務(wù)(如:訂單查詢、物流追蹤 等),一旦發(fā)現(xiàn)違規(guī)使用,開放平臺將立即收回該appkey的Taobao ID使用權(quán)限。
特別注意
此文檔描述的授權(quán)頁面僅適用于PC端,如果您的頁面是在手機(jī)淘寶/天貓客戶端中被訪問,請參考這里。如果您的頁面是在H5手機(jī)瀏覽器中被訪問,請參考這里。
一、Server-side flow
此流程要求ISV應(yīng)用有Web Server應(yīng)用,能夠保存應(yīng)用本身的密鑰以及狀態(tài),可以通過https直接訪問淘寶的授權(quán)服務(wù)器。
1、請求入口地址
1)獲取授權(quán)碼(code)
正式環(huán)境:https://oauth.taobao.com/authorize
沙箱環(huán)境:https://oauth.tbsandbox.com/authorize
2)獲取訪問令牌(access_token)
正式環(huán)境:https://oauth.taobao.com/token
沙箱環(huán)境:https://oauth.tbsandbox.com/token
2、授權(quán)操作步驟
此處以正式環(huán)境獲取acccess_token為例說明,如果是沙箱環(huán)境測試,需將請求入口地址等相關(guān)數(shù)據(jù)換成沙箱對應(yīng)入口地址,操作流程則同正式環(huán)境一致。
實(shí)際進(jìn)行授權(quán)操作時,測試的數(shù)據(jù) client_id、client_secret、redirect_uri 均需要根據(jù)自己創(chuàng)建的應(yīng)用實(shí)際數(shù)據(jù)給予替換,不能拿示例中給出的值直接進(jìn)行測試,以免影響實(shí)際測試效果。下圖為Server-side flow 授權(quán)方式流程圖,以下按流程圖逐步說明。
1)拼接授權(quán)url
拼接用戶授權(quán)需訪問url ,示例及參數(shù)說明如下:
https://oauth.taobao.com/authorize?response_type=code&client_id=23075594&redirect_uri=http://www.oauth.net/2/&state=1212&view=web
3)獲取code2)引導(dǎo)用戶登錄授權(quán)
引導(dǎo)用戶通過瀏覽器訪問以上授權(quán)url,將彈出如下登錄頁面。用戶輸入賬號、密碼點(diǎn)“登錄”按鈕,即可進(jìn)入授權(quán)頁面。
上圖頁面,若用戶點(diǎn)“授權(quán)”按鈕后,TOP會將授權(quán)碼code 返回到了回調(diào)地址上,應(yīng)用可以獲取并使用該code去換取access_token;
若用戶未點(diǎn)授權(quán)而是點(diǎn)了“取消”按鈕,則返回如下結(jié)果,其中error為錯誤碼,error_description為錯誤描述。分別如下圖所示:
說明:
可發(fā)布服務(wù)市場(fuwu.taobao.com)的應(yīng)用,在應(yīng)用上線后,如購買應(yīng)用的用戶,通過"我的服務(wù)--立即使用”訪問(下圖),系統(tǒng)會自動跳到授權(quán)頁面(因此這種方式訪問應(yīng)用的,不需要拼接url),只需注意獲取code即可。同時返回code時,還會返回通過state傳遞訂購服務(wù)相關(guān)的信息,類似:
state=versionNo:1;itemCode:xxxxx (versionNo 為應(yīng)用版本號、itemCode為應(yīng)用收費(fèi)代碼)
4)換取access_token
利用linux 的curl 命令 獲取access_token(授權(quán)令牌),如下;對于應(yīng)用程序,可以參考文檔**示例**
這里的示例代碼。
curl -i -d "code=OxlukWofLrB1Db1M6aJGF8x2332458&grant_type=authorization_code&client_id=23075594&
client_secret=69a1469a1469a1469a14a9bf269a14&redirect_uri=http://www.oauth.net/2/ "https://oauth.taobao.com/token
{ "w2_expires_in": 0, "taobao_user_id": "263685215", "taobao_user_nick": "%E5%95%86%E5%AE%B6%E6%B5%8B%E8%AF%95%E5%B8%90%E5%8F%B752", "w1_expires_in": 1800, "re_expires_in": 0, "r2_expires_in": 0, "expires_in": 86400, "token_type": "Bearer", "refresh_token": "6200e1909ca29b04685c49d67f5ZZ3675347c0c6d5abccd263685215", "access_token": "6200819d9366af1383023a19907ZZf9048e4c14fd56333b263685215", "r1_expires_in": 1800 } |
換取access_token返回值示例
二、Client-side flow
客戶端應(yīng)用授權(quán)方式,適合ISV沒有獨(dú)立的web Server,但是能夠借助瀏覽器或者JS腳本訪問授權(quán)服務(wù)器的應(yīng)用。
1、請求入口地址
正式環(huán)境:https://oauth.taobao.com/authorize
沙箱環(huán)境:https://oauth.tbsandbox.com/authorize
2、授權(quán)操作步驟
以正式環(huán)境獲取acccess_token為例說明,如果是沙箱環(huán)境請使用沙箱數(shù)據(jù)。
同時在授權(quán)過程中client_id等參數(shù)需要根據(jù)自己創(chuàng)建應(yīng)用的實(shí)際數(shù)據(jù)給予替換,否則無法完成授權(quán)。
下圖為Client-side flow 授權(quán)方式流程圖,以下按流程圖逐步詳細(xì)說明
1)拼接授權(quán)url
https://oauth.taobao.com/authorize?response_type=token&client_id=23075594&state=1212&view=web
2)導(dǎo)用戶登錄授權(quán)
這一步同Server-side flow授權(quán)方式,引導(dǎo)用戶訪問授權(quán)url 進(jìn)行授權(quán),如下。
3)獲取access_token
此處上圖頁面點(diǎn)授權(quán)后,TOP會直接將access_token 返回到淘寶默認(rèn)頁面(和 Server-side flow 先返回code 再換access_token方式不同)此時可使用JS腳本(if(window.location.hash!=""){alert(window.location.hash)})可以獲取回調(diào)頁面#后面的字段,從而獲取到訪問令牌。
返回參數(shù)示例:
https://oauth.taobao.com/oauth2?view=web#access_token=6101227f5e8c230696ac93a77b3de7daacb154c6ad98106263664221&token_type=Bearer&expires_in=86400&refresh_token=6100627e3f9202c0960a6ab5bfd704939c91635892c70dd263664221&re_expires_in=86400&r1_expires_in=86400&r2_expires_in=86400&taobao_user_id=263664221&taobao_user_nick=%E5%95%86%E5%AE%B6%E6%B5%8B%E8%AF%95%E5%B8%90%E5%8F%B717&w1_expires_in=86400&w2_expires_in=86400&state=1212&top_sign=3429C556FCD3F3FC52547DD31021592F
注:
此處參數(shù)返回除 top_sign 外,同Server-side flow授權(quán)返回參數(shù)相同,這里不再詳細(xì)描述,具體可參考 Server-side flow 里面的說明。
top_sign 是系統(tǒng)生成簽名參數(shù),使用 Client-side flow 方式授權(quán)需要對該參數(shù)進(jìn)行一致性驗(yàn)證。
4) 驗(yàn)證授權(quán)簽名
即驗(yàn)證返回參數(shù)和 top_sign 是否一致。如上返回參數(shù)中,把井號之后除 top_sign外所有key和value按照參數(shù)的首字母順序排列,以 key1+value+key2+value....的方式拼接在一起,再在其前后加上的AppSecret(假設(shè)AppSecret=69a1469a1469a1469a14a9bf269a14),然后轉(zhuǎn)成utf-8編碼,接著進(jìn)行md5加密,最后全部轉(zhuǎn)大寫即可。
md5(utf-8:AppSecret+k1+v1+k2+v2+...+kn+vn + AppSecret)。
如以下返回參數(shù),取 # 號之后的參數(shù)進(jìn)行拼接并首尾加上AppSecret后得到如下結(jié)果:
69a1469a1469a1469a14a9bf269a14access_token6101227f5e8c230696ac93a77b3de7daacb154c6ad98106263664221token_typeBearer
expires_in86400refresh_token6100627e3f9202c0960a6ab5bfd704939c91635892c70dd263664221re_expires_in86400r1_expires_in86400
r2expires_in86400taobao_user_id263664221taobao_user_nick%E5%95%86%E5%AE%B6%E6%B5%8B%E8%AF%95%E5%B8%90%E5%8F%B717w1_expires_in86400&w2_expires_in86400&state121269a1469a1469a1469a14a9bf269a14
進(jìn)行md5加密(參考API調(diào)用示例代碼)并轉(zhuǎn)化成大寫后得到:3429C556FCD3F3FC52547DD31021592F ,和top_sign 一致。
退出登錄
退出流程目前只支持web訪問,起到的作用是清除taobao.com的cookie,并不是取消用戶的授權(quán)。在WAP上訪問無效。
一、請求入口地址
1、正式環(huán)境:https://oauth.taobao.com/logoff
2、沙箱環(huán)境:https://oauth.tbsandbox.com/logoff
二、退出操作步驟
拼接退出url(如 https://oauth.taobao.com/logoff?client_id=12304977&view=web)并訪問即可,退出后跳轉(zhuǎn)到淘寶首頁 。
刷新授權(quán)
通過授權(quán)獲取的refresh_token,可用來刷新access token 的r2時長。
由于r1 或w1 通常同訂購時長一致,一般不需刷新,w2必須通過重新授權(quán)給予延長,故refresh_token 一般僅用于r2 有效時長的延長。
操作方法類似獲取access token ,僅請求參數(shù)有區(qū)別,說明如下:
相關(guān)說明
一、授權(quán)時長說明
授權(quán)獲得的 access_token 有效時長(expires_in )和標(biāo)簽類型(如IT工具、商家后臺系統(tǒng)等)、狀態(tài)(如正式環(huán)境、上線等)相關(guān)如下。
注:實(shí)際api 調(diào)用時,對應(yīng)用授權(quán)時長做了更精確的控制,具體可參考(二、安全等級說明);另像“第三方IT工具”類應(yīng)用開發(fā)上線后都是發(fā)布在 fuwu.taobao.com上,賣家需要訂購使用,相應(yīng)授權(quán)時長會和訂購時長相同,如購買1個月,則取得的access_token有效時長1個月。
二、安全等級說明
為了更加靈活的對淘寶開放平臺開放的數(shù)據(jù)進(jìn)行安全管控, 降低用戶數(shù)據(jù)泄露或者被惡意修改的風(fēng)險(xiǎn),推出了安全等級的概念。
淘寶開放平臺對API(或者API字段)及 應(yīng)用分別打了r1、r2、w1、w2 和 0,1,2,3四種安全級別的標(biāo)記。與 r1、r2、w1、w2對應(yīng)的是在access token(session key)頒發(fā)時增加了4個過期時間:r1_expires_in、r2_expires_in、w1_expires_in、w2_expires_in。這4個值分別用來表示此access token 調(diào)用各級別API(或字段)的有效期,如下:(受安全等級限制的應(yīng)用有:第三方IT工具、服務(wù)商后臺系統(tǒng)、店鋪模塊后臺這3類應(yīng)用;商家后臺系統(tǒng)和新業(yè)務(wù)這類賣家自用型應(yīng)用暫不受影響。)
安全等級 | API級別 | 正式環(huán)境測試 | 上線運(yùn)行中 | 是否可刷新 | Refresh刷新時長 |
---|---|---|---|---|---|
3級 | R1 | 24小時 | 同訂購時長 | 是 | 已上線應(yīng)用與訂購時長一致,正式環(huán)境測試24小時有效 |
3級 | R2 | 24小時 | 同訂購時長 | 是 | 已上線應(yīng)用與訂購時長一致,正式環(huán)境測試24小時有效 |
3級 | W1 | 24小時 | 同訂購時長 | 是 | 已上線應(yīng)用與訂購時長一致,正式環(huán)境測試24小時有效 |
3級 | W2 | 24小時 | 同訂購時長 | 是 | 已上線應(yīng)用與訂購時長一致,正式環(huán)境測試24小時有效 |
2級 | R1 | 24小時 | 同訂購時長 | 是 | 已上線應(yīng)用與訂購時長一致,正式環(huán)境測試24小時有效 |
2級 | R2 | 24小時 | 72小時 | 是 | 已上線應(yīng)用與訂購時長一致,正式環(huán)境測試24小時有效 |
2級 | W1 | 24小時 | 同訂購時長 | 是 | 已上線應(yīng)用與訂購時長一致,正式環(huán)境測試24小時有效 |
2級 | W2 | 30分鐘 | 30分鐘 | 否 | |
1級 | R1 | 24小時 | 同訂購時長 | 是 | 已上線應(yīng)用與訂購時長一致,正式環(huán)境測試24小時有效 |
1級 | R2 | 24小時 | 24小時 | 否 | |
1級 | W1 | 24小時 | 同訂購時長 | 是 | 已上線應(yīng)用與訂購時長一致,正式環(huán)境測試24小時有效 |
1級 | W2 | 5分鐘 | 5分鐘 | 否 | |
0級 | R1 | 30分鐘 | 30分鐘 | 否 | |
0級 | R2 | 0分鐘 | 0分鐘 | 否 | |
0級 | W1 | 30分鐘 | 30分鐘 | 否 | |
0級 | W2 | 0分鐘 | 0分鐘 | 否 |
示例代碼
一、獲取access_token示例
示例代碼均基于sdk實(shí)現(xiàn),sdk下載及使用參考 說明。
1、JAVA 示例
import java.io.IOException; import java.util.HashMap; import java.util.Map; import com.taobao.api.internal.util.WebUtils; //引用top sdk public class open_oauth { public static void main(String[] args) { String url="https://oauth.taobao.com/token"; Map<String,String> props=new HashMap<String,String>(); props.put("grant_type","authorization_code"); /*測試時,需把test參數(shù)換成自己應(yīng)用對應(yīng)的值*/ props.put("code","test"); props.put("client_id","test"); props.put("client_secret","test"); props.put("redirect_uri","http://www.test.com"); props.put("view","web"); String s=""; try{s=WebUtils.doPost(url, props, 30000, 30000); System.out.println(s); }catch(IOException e){ e.printStackTrace();} } }
2、PHP 示例
<?php /*測試時,需把test參數(shù)換成自己應(yīng)用對應(yīng)的值*/ $url = 'https://oauth.taobao.com/token'; $postfields= array('grant_type'=>'authorization_code', 'client_id'=>'test', 'client_secret'=>'test', 'code'=>'test', 'redirect_uri'=>'http://www.test.com'); $post_data = ''; foreach($postfields as $key=>$value){ $post_data .="$key=".urlencode($value)."&";} $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0); //指定post數(shù)據(jù) curl_setopt($ch, CURLOPT_POST, true); //添加變量 curl_setopt($ch, CURLOPT_POSTFIELDS, substr($post_data,0,-1)); $output = curl_exec($ch); $httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); echo $httpStatusCode; curl_close($ch); var_dump($output); ?>
3、.NET 示例
namespace Oauth2._0 { class Program { static void Main(string[] args) { WebUtils webUtils = new WebUtils(); IDictionary<string, string> pout = new Dictionary<string, string>(); pout.Add("grant_type", "authorization_code"); pout.Add("client_id", "test"); pout.Add("client_secret", "test"); pout.Add("code", "test"); pout.Add("redirect_uri", "http://www.test.com"); string output = webUtils.DoPost("https://oauth.taobao.com/token", pout); Console.Write(output); Console.ReadLine(); } } }
二、refresh_token刷新示例
以下為基于sdk的java示例,其它語言可參考token獲取方法,是類似的,同時測試時,需把test參數(shù)換成自己應(yīng)用實(shí)際對應(yīng)的值。
import java.io.IOException; import java.util.HashMap; import java.util.Map; import com.taobao.api.internal.util.WebUtils; public class test_refresh { public static void main(String[] args) { String url="https://oauth.taobao.com/token"; Map<String,String> props=new HashMap<String,String>(); props.put("grant_type","refresh_token"); props.put("refresh_token","test"); props.put("client_id","test"); props.put("client_secret","test"); String s=""; try{s=WebUtils.doPost(url, props, 30000, 30000); System.out.println(s); }catch(IOException e){ e.printStackTrace(); } }
以上把responseJson 轉(zhuǎn)化為對象,或者直接從里面提取access_token字段以及新的刷新令牌
refresh_token返回結(jié)果內(nèi)容示例
{
"w2_expires_in": 0, "taobao_user_id": "263685215", "taobao_user_nick": "%E5%95%86%E5%AE%B6%E6%B5%8B%E8%AF%95%E5%B8%90%E5%8F%B752", "w1_expires_in": 1800, "re_expires_in": 0, "r2_expires_in": 0, "expires_in": 86400, "token_type": "Bearer", "refresh_token": "6200e1909ca29b04685c49d67f5ZZ3675347c0c6d5abccd263685215", "access_token": "6200819d9366af1383023a19907ZZf9048e4c14fd56333b263685215", "r1_expires_in": 1800 } |
常見問題
1、授權(quán)獲取token時,appkey是已傳入,仍報(bào):client_id is empty 錯誤?
授權(quán)另一關(guān)鍵參數(shù)client_secret錯誤,會導(dǎo)報(bào)該錯誤,重點(diǎn)檢查
2、是否一定需要沙箱先進(jìn)行授權(quán)測試?
并不做這樣要求,可以是“先沙箱測試授權(quán),再正式環(huán)境”的方式;也可以直接“正式環(huán)境測試授權(quán)”的方式
3、授權(quán)相關(guān)常用文檔有那些?
- 多店鋪管理:查看
- 快速授權(quán)工具:查看
- 提高安全等級辦法:查看
- 安全等級詳細(xì)說明:查看
4、授權(quán)更多問題及錯誤碼參考:查看
FAQ
- 關(guān)于此文檔暫時還沒有FAQ