您當前位置>首頁 » 新聞資(zī)訊 » 小程序相關(guān) >
淺析微信小程序登錄與授權
發表時間:2020-10-10
發布人:葵宇科技
浏覽次數:54
淺析微信小程序登錄與授權
很多人會把微信小程序的登錄和(hé)授權搞混淆。
微信小程序登錄
其實微信小程序的登錄作用就跟傳統的帳号密碼登錄一樣,隻是不用用戶手工輸入帳号密碼。
小程序登錄過程分兩部分交互:
- 小程序向開發者服務器(qì)請求登錄
code ===> token(自定義登錄态)
- 開發者服務器(qì)向微信接口服務器(qì)請求登錄
appid + appsecret + code ===> openid + session_key
我們可(kě)以把調用wx.login()返回的code當成傳統登錄的帳号。
而密碼呢(ne),則是由開發者服務器(qì)與微信接口服務器(qì)驗證這一步替代。
返回的自定義登錄态就是傳統登錄的token了。
code:登錄憑證(帳号)由wx.login()獲得
appid + appsecret:相當于密碼
session_key:微信接口返回的token
openid:用戶标識,相當于帳号
自定義登錄态:開發者服務生成并發送給小程序端的token,用于标識用戶是否已經登錄并在每個(gè)交互請求中(zhōng)攜帶,用于開發者服務器(qì)識别用戶。
以下(xià)為微信官方幫助的登錄流程圖:
這裡大家可(kě)能會有幾個(gè)問(wèn)題
-
session_key有什麼用?
session_key用于解密返回的加密數據
- wx.getUserInfo()
- 獲取用戶手機号碼
-
session_key的有效期是多長?
通(tōng)過 wx.login 接口獲得的用戶登錄态擁有一定的時效性。
用戶越久未使用小程序,用戶登錄态越有可(kě)能失效。
反之如(rú)果用戶一直在使用小程序,則用戶登錄态一直保持有效。
具體時效邏輯由微信維護,對開發者透明。
調用wx.login(),會讓之前的session_key失效,因此每次調用wx.login()後都要把code發送到服務器(qì)端更新session_key
-
自定義登錄态應該怎麼設置有效期?
自定義登錄态其實跟session_key沒什麼關(guān)系,有效期的設置就跟傳統的session那樣設置就可(kě)以。
-
什麼時候調用wx.login()?
因為調用wx.login()的目的是獲取code,從而更新服務器(qì)的session_key,所以當session_key登錄态失效時調用。
-
什麼時候調用wx.checkSession()?
因為wx.checkSession()的作用是檢查登錄态(session_key)是否失效,所以結合1,4兩點,在以下(xià)情況下(xià)應該調用wx.checkSession()
- 在獲取用戶信息或用戶手機号碼之前
- 在其他的服務器(qì)需要使用到session_key進行解密數據的情況下(xià)
-
如(rú)何處理小程序登錄流程?(以下(xià)token為自定義登錄态)
- 用戶未登陸(本地無token)、token失效或微信登錄态失效
- 調用wx.login()獲取code,發送到開發服務器(qì)
- 開發服務器(qì)使用appid + appsecret + code 向微信接口服務器(qì)獲取openid+session_key
- 開發服務器(qì)生成token,并建立token、openid、session_key的關(guān)聯
- 開發服務器(qì)返回token給小程序端,小程序端保存toke到本地緩存(storage,數據庫等)
-
如(rú)何處理檢查登錄态流程?
- 有加密數據要發送到服務器(qì)進行解密操作,如(rú)獲取用戶信息,獲取用戶手機号碼等
- 調用wx.checkSession()
- 如(rú)果登錄态有效,轉5
- 如(rú)果登錄态失效,調用wx.login()走小程序登錄流程,登陸成功後轉5
- 發起服務器(qì)請求發送加密數據給服務器(qì)解密
-
常見處理流程
以下(xià)請求都帶本地保存的token
-
不需登錄的請求
- 直接請求
-
需要登錄的請求
- 直接請求,返回未登錄狀态
- 執行小程序登錄流程,保存本地token
- 重新請求
-
需要處理解密數據的請求
這裡有兩種處理方式(建議使用第一種):
- 一進入頁面就進行用戶登錄狀态和(hé)微信登錄态的檢查
- 用戶操作getUserInfo,getPhoneNumber等操作的回調函數中(zhōng)做用戶登錄狀态和(hé)微信登錄态的檢查
處理方式一
- 檢查是否登錄
- 未登錄(本地token為空或接口返回token失效)則執行小程序登錄流程,本地保存最新token【這時微信登錄态是有效的,因為這過程重新獲取了session_key】
- 已登錄(本地token不為空且接口返回token未失效),則不執行小程序登錄流程。【這時還不知道微信登錄态是否失效】
- 檢查登錄态
- 登錄态失效,執行小程序登錄流程。
- 登錄态有效,不操作。
- 等待用戶操作getUserInfo,getPhoneNumber等操作
- 用戶操作回調方法中(zhōng)把加密數據發送到服務器(qì)進行解密
處理方式二
- 等待用戶操作getUserInfo,getPhoneNumber等操作
- 檢查是否登錄
- 未登錄(本地token為空或接口返回token失效)則執行小程序登錄流程,本地保存最新token【這時微信登錄态是有效的,因為這過程重新獲取了session_key】
- 已登錄(本地token不為空且接口返回token未失效),則不執行小程序登錄流程。【這時還不知道微信登錄态是否失效】
- 檢查登錄态
- 登錄态失效,執行小程序登錄流程。
- 登錄态有效,不操作。
- 如(rú)果2,3步驟中(zhōng)有執行過小程序登陸流程,則提示用戶重新點擊,轉到1
- 把加密數據發送到服務器(qì)進行解密
-
微信小程序授權
為什麼要授權?
在與用戶交互的過程中(zhōng),我們需要獲取并記錄用戶的一些信息,以提供個(gè)性化的服務,而這些用戶信息涉及到隐私,這時候就需要用戶授權同意使用這些信息。
獲取信息的流程
-
檢查用戶是否已經授權
調用wx.getSetting(),如(rú)果已授權,轉3,如(rú)果未授權,轉2
-
引導用戶授權
展現授權按鈕,用戶點擊并同意
-
獲取用戶信息
調用對應的信息獲取接口或在用戶點擊按鈕的回調事件中(zhōng)獲取用戶信息
如(rú) wx.getUserInfo(),wx.getLocation()
授權是不是一定要登錄?
授權并不需要微信登錄,但很多時候授權獲取用戶信息時,獲取到的信息需要進行解密,這時需要有效的 session_key,所以當 session_key失效時,就需要重新執行微信登錄來更新session_key。
反之,登錄也并不需要授權,隻有在需要獲取用戶信息時才需要授權。
換手機登錄微信會發生什麼?
token失效,因為token保存在本地,換手機後沒有原手機上保存的token,或跟原手機的token不一樣
微信登錄态不變,如(rú)果還在有效期内,換手機後調用wx.checkSession()仍然會返回有效