這個流程分為兩大部分:
小程式使用 wx.login() api 獲取 code,並由開發者後端伺服器換取open_id 和 session_key,小程式使用 wx.getuserinfo() api 獲取 encrypteddata 和 iv,然後將這三個資訊傳送給開發者伺服器伺服器。
開發者伺服器獲取到 code、encrypteddata和 iv 後,將 session_key 利用 encrypteddata 和 iv 解密,在服務端獲取使用者資訊。根據使用者資訊返回 jwt 資料,完成登入狀態。
小程式通過wx.login
返回值屬性型別
說明code
string
使用者允許登入後,**內容會帶上 code(有效期五分鐘)
小程式端可以通過 wx.getsetting 介面獲取使用者當前的授權狀態
小程式端呼叫wx.getuserinfoapi 來獲得使用者資訊(該介面的呼叫需要獲得使用者授權)
介面success 時返回引數如下:
引數名型別
說明userinfo
object
使用者資訊物件,不包含 openid 等敏感資訊。
rawdata
string
不包括敏感資訊的原始資料字串,用於計算簽名。
signature
string
使用 sha1( rawdata + sessionkey ) 得到字串,用於校驗使用者資訊
encrypteddata
string
包括敏感資料在內的完整使用者資訊的加密資料,詳細見加密資料解密演算法
ivstring
加密演算法的初始向量,詳細見加密資料解密演算法
將這些第一步獲得的js_code
和這裡獲得的rawdata
,signature
,encrypteddata
,iv
一起打包傳入開發者後端。
開發者伺服器接收到code
之後,會進行封裝處理,通過code2session
請求引數
屬性型別
預設值必填
說明string
是secret
string
是js_code
string
是登入時獲取的 code
grant_type
string
是授權型別,此處只需填寫 authorization_code
返回值(返回json資料報)
屬性型別
說明openid
string
使用者唯一標識
session_key
string
會話金鑰
unionid
string
使用者在開放平台的唯一識別符號,在滿足 unionid 下發條件的情況下會返回
errcode
number
錯誤碼errmsg
string
錯誤資訊
這時,伺服器需要判斷返回的json資料報是否包含unionid:
如果不包含,返回第1步,提醒使用者授權
encrypteddata
解密後為以下 json 結構,詳見加密資料解密演算法
}
解密指令碼例項連線:資料簽名校驗
資料簽名校驗具體步驟
使用簽名演算法通過rawdata
和session_key
計算簽名signature2
對比signature
和signature2
如果code
不為空,但rawdata
為空,從 redis 根據code
查詢快取的使用者資訊
自定義登入態的資訊不僅可以包含 token,也可以包含一些使用者許可權資訊,或者其他資訊,因為是自定義的登入態,維護也是很自定義的。
小程式客戶端接收到返回的自定義登入態資訊,從而判斷使用者是否登入成功,登入成功的話,就將自定義登入態資訊儲存到本地的儲存。到這裡,登入就完成了。
儲存到本地儲存的好處就是,後續使用的這個自定義登入態就不需要再次跟伺服器進行互動來獲取了,只需要呼叫本地儲存就行了,這裡是為了優化效能和避免浪費資源。
小程式客戶端訪問業務介面的時候,攜帶之前儲存到本地儲存的自定義登入態資訊進行對開發者伺服器(業務介面伺服器)訪問。
開發者伺服器的業務介面接收到請求,並且請求裡面攜帶了自定義的登入態,通過校驗之後,會返回相關資訊。
校驗登入是將小程式客戶端攜帶過來的自定義登入態和開發者伺服器快取起來的自定義登入態進行對比,會去確認是否和使用者的openid
或者unionid
和session_key
相匹配。
3rd_session
是一般是指開發者伺服器的登入態,本文中並沒有使用這個概念,而是叫做自定義登入態或者直接說jwttoken,官方文件或者其他一些部落格中會提到它。實際上他們是相同的概念。
當小程式登入態沒過期,自定義登入態過期了的時候,那麼小程式客戶端訪問業務介面的時候,業務介面會告訴小程式客戶端,你的自定義登入態超時了,然後小程式客戶端會重新執行登入邏輯,然後通知開發者服務重新生成新的自定義登入態,然後關聯之前還在使用的小程式登入態。
當二者都同時過期的時候,那就肯定要發起完整的重新登入了。
這樣的好處是自定義登入態不需要重複建立,也能跟小程式登入態一起維護管理,達到資源合理利用的效果。
一般自定義登入態的管理都會使用類似 redis 之類的東西來進行管理的,這裡也涉及到乙個自定義登入態的快取策略,快取起來,在一定時間內不需要重新建立自定義登入態,達到優化效能的效果。
如果每次開啟小程式都需要使用者來登入顯然是不合適的,如果使用者上一次的登入態還沒有過期,則應該視使用者為已經登入。如果過期,才需要使用者重新登入。
有2種方式來做:
方式一:小程式開啟的時候先檢查小程式本地是否有儲存的自定義登入態,
如果過期,則發起完整的登入流程。
如果不過期,則繼續使用本地儲存的自定義登入態。(如果本地的自定義登入態沒有的話,那麼也是要強制發起完整的登入流程的)
某些業務需要只有使用者登入狀態下才可以執行,所以,我們需要封裝乙個api來驗證使用者時候登入
微信小程式登入流程 微信登入
提高使用者體驗 制定產品策略 token 登入態是個邏輯詞彙,token可以理解為登入態的具象化 資料化,在上面的流程圖中,可以看到token是由開發者伺服器建立的乙個字元,而且需要跟openid和session key相關聯,關聯完成之後開發者伺服器將 token下發到客戶端,客戶端儲存在本地,後...
微信小程式 後端介面
主要controller介面 namespace addons fenxi controller use home controller addonscontroller class fenxicontroller extends addonscontroller this ajaxreturn l...
微信小程式 一 微信登入
前端 請求伺服器 wx.request method get header 設定請求的 header success function res console.log 伺服器返回 res.data.result console.log 伺服器返回 res.data.msg fail function...