平台技術-使用者授權介紹
登入授權
若您的應用程式與淘寶開放平台對接時需要取得使用者隱私資料(如商品、訂單等),為確保使用者資料的安全與隱私,您的應用程式需要取得使用者的授權,即取得存取使用者資料的授權令牌Access Token (即原始的SessionKey)。在這種情況下,您的應用程式需要引導使用者完成使用淘寶帳號「登入授權」的流程。此流程採用國際通用的OAuth2.0標準協定作為使用者身分驗證與授權協議,支援網站、手機用戶端、桌面用戶端。
目前淘寶OAuth2.0服務支援採用兩種方式取得Access Token(授權令牌),即 Server-side flow 和 Client-side flow ,詳見如下說明。
附註:Taobao ID(淘帳號)產品不得用於阿里巴巴集團非官方管道為淘寶買家提供淘寶會員類服務(如:訂單查詢、物流追蹤等),一旦發現違規使用,開放平台將立即收回該appkey的Taobao ID使用權限。
特別注意
此文件描述的授權頁面僅適用於PC端,如果您的頁面是在手機淘寶/天貓客戶端中被訪問,請參考這裡。如果您的頁面是在H5手機瀏覽器中被訪問,請參考這裡。
一、Server-side flow
此流程要求ISV應用程式有Web Server應用,能夠保存應用程式本身的金鑰以及狀態,可以透過https直接存取淘寶的授權伺服器。
1、請求入口位址
1)取得授權碼(code)
正式環境:https://oauth.taobao.com/ authorize
沙箱環境:https://oauth.tbsandbox.com/authorize
2)取得存取權杖(access_token)
正式環境:https ://oauth.taobao.com/token
沙箱環境:https://oauth.tbsandbox.com/token
2、授權作業步驟
此處以正式環境取得acccess_token為例說明,若是沙箱環境測試,需將請求入口位址等相關資料換成沙箱對應入口位址,操作流程則同正式環境一致。
實際進行授權操作時,測試的資料 client_id、client_secret、redirect_uri 均需要根據自己建立的應用實際資料給予替換,不能拿範例中給出的值直接進行測試,以免影響實際測試效果。下圖為Server-side flow 授權方式流程圖,以下依流程圖逐步說明。
1)拼接授權url
拼接使用者授權需存取url ,範例及參數說明如下:
https://oauth.taobao.com/authorize?response_type= code&client_id=23075594&redirect_uri=http://www.oauth.net/2/&state=1212&view=web
3)取得code2)引導使用者登入授權
引導使用者透過瀏覽器存取以上授權url,將彈出以下登入頁面。使用者輸入帳號、密碼點「登入」按鈕,即可進入授權頁面。
上圖頁面,若用戶點「授權」按鈕後,TOP會將授權碼code 回復到了回呼位址上,應用程式可以取得並使用該code去換取access_token;
若使用者未點授權而是點了「取消」按鈕,則傳回以下結果,其中error為錯誤碼,error_description為錯誤描述。分別如下圖:
說明:
可發佈服務市場(fuwu.taobao.com)的應用,在應用程式上線後,如購買應用程式的用戶,透過"我的服務--立即使用」存取(下圖),系統會自動跳到授權頁面(因此這種方式存取應用程式的,不需要拼接url),只需注意取得code即可。同時返回code時,也會傳回透過state傳遞訂購服務相關的訊息,類似:
state=versionNo:1;itemCode:xxxxx (versionNo 為應用程式版本號、itemCode為應用程式收費代碼)
4)換取access_token
利用linux 的curl 命令取得access_token(授權令牌),如下;對於應用程序,可以參考文件 **範例**
這裡的範例程式碼。
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": "商家測試帳號52", “w1_expires_in”:1800, “re_expires_in”:0, “r2_expires_in”:0, “expires_in”:86400, “token_type”:“承載者”, “refresh_tokentype”:“承載者”, ” ” :“6200e1909ca29b04685c49d67f5ZZ3675347c0c6d5abccd263685215”, “access_token”:“6200819d9366af13830236 215 “, “r1_expires_in”:1800 | }
換取access_token傳回值範例
二、Client-side flow
1、要求入口地址
正式環境:https://oauth.taobao.com/authorize
#以正式環境取得acccess_token為例說明,如果是沙箱環境請使用沙箱資料。
同時在授權過程中client_id等參數需要依照自己建立應用的實際資料給予替換,否則無法完成授權。下圖為Client-side flow 授權方式流程圖,以下依流程圖逐步詳細說明1)拼接授權url
附註:
此處參數回傳除 top_sign 外,同Server-side flow授權回傳參數相同,這裡不再詳細描述,具體可參考 Server-side flow 裡面的說明。
top_sign 是系統產生簽章參數,使用 Client-side flow 方式授權需要對該參數進行一致性驗證。
4) 驗證授權簽章
即驗證傳回參數與 top_sign 是否一致。如上返回參數中,把井號之後除top_sign外所有key和value按照參數的首字母順序排列,以key1 value key2 value....的方式拼接在一起,再在其前後加上的AppSecret(假設AppSecret =69a1469a1469a1469a14a9bf269a14),然後轉成utf-8編碼,接著進行md5加密,最後全部轉大寫即可。
md5(utf-8:AppSecret k1 v1 k2 v2 ... kn vn AppSecret)。
如以下返回參數,取# 號之後的參數進行拼接並首尾加上AppSecret後得到如下結果:
69a1469a1469a1469a14a9bf269a14access_token6101227f5e8c2306969a14access_token6101227f5e8c2306969a14access_token6101227f5e8c2306969606260 1token_typeBearer
expires_in86400refresh_token6100627e3f9202c0960a6ab5bfd704939c91635892c70dd263664221re_expirec91860018063664221re_expires_
##r2expires_in86400taobao_user_id263664221taobao_user_nick商家測試帳號17w1_expires_in86400&w2_expires_in86400&state121269a1469a1464#196400&state121269a1469a11464# (參考API呼叫範例程式碼)並轉換成大寫後得到:3429C556FCD3F3FC52547DD31021592F ,和top_sign 一致。 退出登入
退出流程目前只支援web訪問,起到的作用是清除taobao.com的cookie,並不是取消使用者的授權。在WAP上存取無效。
一、請求入口地址1、正式環境:https://oauth.taobao.com/logoff
2、沙箱環境:https://oauth.tbsandbox.com/logoff
二、退出作業步驟
https://oauth.taobao.com/logoff?client_id=12304977&view=web)並造訪即可,退出後跳到淘寶首頁。
刷新授權######透過授權取得的refresh_token,可用來刷新access token 的r2時長。 ###由於r1 或w1 通常與訂購時長一致,一般不需刷新,w2必須透過重新授權給予延長,故refresh_token 一般僅用於r2 有效時長的延長。 ###操作方法類似取得access token ,僅請求參數有區別,說明如下:################相關說明########一、授權時長說明######授權所獲得的 access_token 有效時長(expires_in )和標籤類型(如IT工具、商家後台系統等)、狀態(如正式環境、上線等)相關如下。
註:實際api 呼叫時,對應用授權時長做了更精確的控制,具體可參考(二、安全等級說明);另像「第三方IT工具」類別應用程式開發上線後來都是發佈在fuwu.taobao.com上,賣家需要訂購使用,相應授權時長會和訂購時長相同,如購買1個月,則取得的access_token有效時長1個月。
二、安全等級說明
為了更靈活的對淘寶開放平台開放的資料進行安全管控, 降低使用者資料外洩或被惡意修改的風險,推出了安全等級的概念。
淘寶開放平台對API(或API欄位)及 應用分別打了r1、r2、w1、w2 和 0,1,2,3四種安全等級的標記。與 r1、r2、w1、w2對應的是在access token(session key)頒發時增加了4個過期時間:r1_expires_in、r2_expires_in、w1_expires_in、w2_expires_in。這4個值分別用來表示此access token 呼叫各層級API(或欄位)的有效期限,如下:(受安全等級限制的應用有:第三方IT工具、服務商後台系統、店鋪模組後台這3類應用;商家後台系統和新業務這類賣家自用型應用程式暫不受影響。)
安全等級 | API等級 | 正式環境測試 | 上線運行中 | 是否可重新整理 | Refresh刷新時長 |
---|---|---|---|---|---|
3級 | R1 | 24小時 | 同訂購時長 | 是 | 已上線應用與訂購時間一致,正式環境測試24小時有效 |
3級 | R2 | 24小時 | 同訂購時間 | 是 | #已上線應用程式與訂購時間一致,正式環境測試24小時有效 |
3級 | W1 | 24小時 | 同訂購時間 | #是 | 已上線應用程式與訂購長度一致,正式環境測試24小時有效 |
3級 | #W2 | #24小時 | 同訂購時間 | ||
##是 | 已上線應用程式與訂購時間一致,正式環境測試24小時有效 | ||||
R1 | 24小時 | 同訂購時間 | 是 | 已上線應用程式與訂購時間一致,正式環境測試24小時有效 | |
R2 | 24小時 | 72小時 | 是 | #已上線應用程式與訂購時間一致,正式環境測試24小時有效 | |
W1 | #24小時 | 同訂購時間 | 是 | 已上線應用與訂購時間一致,正式環境測試24小時有效 | |
#W2 | #30分鐘 | 30分鐘 | 否 | ||
#R1 | #24小時 | 同訂購時間 | 是 | 已上線應用程式與訂購時間一致,正式環境測試24小時有效 | |
R2 | 24小時 | 24小時 | 否 | ||
W1 | 24小時 | 同訂購時間 | 是 | 已上線應用程式與訂購時間一致,正式環境測試24小時有效 | |
W2 | 5分鐘 | 5分鐘 | |||
R1 | 30分鐘 | 30分鐘 | 否 | ||
R2 | 0分鐘 | 0分鐘 | |||
W1 | 30分鐘 | 30分鐘 | 否 |
範例程式碼
一、取得access_token範例
#範例程式碼皆基於sdk實現,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参数换成自己应用对应的值*/ 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参数换成自己应用对应的值*/ $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数据 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參數換成自己應用實際對應的值。
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 轉換為對象,或直接從裡面提取access_token欄位以及新的刷新令牌
refresh_token回傳結果內容範例
#{
"w2_expires_in": 0, "taobao_user_id": "263685215", "taobao_user_nick": "商家測試帳號52", "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 } |