摘要:最近公司應公司需求,對天貓精靈對接進行了一番探索,回頭看整個過程並不復雜,但是有些細節做好的話,會走很多的彎路,這篇文章記錄一下過程中的遇上問題以及個人解決的方案,如果有不合適的地方希望大家積極指出。
認識Oanth2.0
認識一個新的事物,個人認為最快的方式是度娘和實踐;一個度娘不行,就多個度娘,一點點的集中關鍵點;這個過程很頭大……廢話不多說;
初步認識oauth2.0是看了大神的一篇文章:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html,里面介紹的還是比較詳細的,但是都是表面的東西;
主要是我記錄一下是;AliGenie平台的認證使用的是其中的 - 授權碼模式;
個人覺得阿里選用這種方式也是意料之中的事情,主要因為授權碼模式是(authorization code)是功能最完整、流程最嚴密的授權模式。它的特點就是通過客戶端的后台服務器,與"服務提供商"的認證服務器進行互動。
這種認證模式的基本模型是:
流程其實很簡單:
- 用戶訪問客戶端,后者將前者導向認證服務器。
- 用戶選擇是否給予客戶端授權。
- 假設用戶給予授權,認證服務器將用戶導向客戶端事先指定的"重定向URI"(redirection URI),同時附上一個授權碼。
- 客戶端收到授權碼,附上早先的"重定向URI",向認證服務器申請令牌。這一步是在客戶端的后台的服務器上完成的,對用戶不可見。
- 認證服務器核對了授權碼和重定向URI,確認無誤后,向客戶端發送訪問令牌(access token)和更新令牌(refresh token)。
這些流程代碼中其實基本已經實現完成,我們做的只是需要簡單的配置;
A步驟中,客戶端申請認證的URI,包含以下參數:
- response_type:表示授權類型,必選項,此處的值固定為"code"
- client_id:表示客戶端的ID,必選項
- redirect_uri:表示重定向URI,可選項
- scope:表示申請的權限范圍,可選項
- state:表示客戶端的當前狀態,可以指定任意值,認證服務器會原封不動地返回這個值。
例如:
GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1 Host: server.example.com
C步驟中,服務器回應客戶端的URI,包含以下參數:
- code:表示授權碼,必選項。該碼的有效期應該很短,通常設為10分鍾,客戶端只能使用該碼一次,否則會被授權服務器拒絕。該碼與客戶端ID和重定向URI,是一一對應關系。
- state:如果客戶端的請求中包含這個參數,認證服務器的回應也必須一模一樣包含這個參數。
例如:
HTTP/1.1 302 Found Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA &state=xyz
重點:在這一步中AliGenie平台中發送的數據中 redirect_uri 這個參數后面帶有自己的參數,整體是以urlEncode后傳遞過來的,這樣的話開始我們就發現整個過程有些奇怪,最后發現這些扯淡的東西根本不用管,應該是AliGenie平台自己做標示用的,這些參數在回調時直接帶上就是了;
接下來就是client(AliGenie平台獲取到code,它會拿到code去認證服務器獲取access_token)
D步驟中,客戶端向認證服務器申請令牌的HTTP請求,包含以下參數:
- grant_type:表示使用的授權模式,必選項,此處的值固定為"authorization_code"。
- code:表示上一步獲得的授權碼,必選項。
- redirect_uri:表示重定向URI,必選項,且必須與A步驟中的該參數值保持一致。
- client_id:表示客戶端ID,必選項。
重點:這一步主要是獲取access_token,主要有兩種方式:
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW 在header中添加一個基本授權
表單提交模式:最訪問參數中添加&client_id=***&client_secret=****(AliGenie是以這樣方式進行提交的)
解決方法:在Oauthserver配置中允許表單提交 allowFormAuthenticationForClients()
之后就可以順利獲取到ossecc_token
數據交互
認證完成之后Aligenie平台會先發送獲取設備的命令,但是這個指令符合access——token認證方式,換句話說,就是一個普通的https接口調用;但是json的數據中帶有access——token數據;
也就是說接下來我們不能直接使用資源服務器對接(這點我也感覺很蛋疼),不知道為什么,有知道的希望告知;