天貓精靈對接記錄(springboot + security+Oauth2.0)


摘要:最近公司應公司需求,對天貓精靈對接進行了一番探索,回頭看整個過程並不復雜,但是有些細節做好的話,會走很多的彎路,這篇文章記錄一下過程中的遇上問題以及個人解決的方案,如果有不合適的地方希望大家積極指出。

認識Oanth2.0

認識一個新的事物,個人認為最快的方式是度娘和實踐;一個度娘不行,就多個度娘,一點點的集中關鍵點;這個過程很頭大……廢話不多說;

初步認識oauth2.0是看了大神的一篇文章:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html,里面介紹的還是比較詳細的,但是都是表面的東西;

主要是我記錄一下是;AliGenie平台的認證使用的是其中的 - 授權碼模式;

個人覺得阿里選用這種方式也是意料之中的事情,主要因為授權碼模式是(authorization code)是功能最完整、流程最嚴密的授權模式。它的特點就是通過客戶端的后台服務器,與"服務提供商"的認證服務器進行互動。

這種認證模式的基本模型是:


流程其實很簡單:
  1. 用戶訪問客戶端,后者將前者導向認證服務器。
  2. 用戶選擇是否給予客戶端授權。
  3. 假設用戶給予授權,認證服務器將用戶導向客戶端事先指定的"重定向URI"(redirection URI),同時附上一個授權碼。
  4. 客戶端收到授權碼,附上早先的"重定向URI",向認證服務器申請令牌。這一步是在客戶端的后台的服務器上完成的,對用戶不可見。
  5. 認證服務器核對了授權碼和重定向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數據;

也就是說接下來我們不能直接使用資源服務器對接(這點我也感覺很蛋疼),不知道為什么,有知道的希望告知;





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM