概述當你開發完了一個小程序并部署上線后,某個微信用戶第一次訪問這個小程序的時候,會彈出一個授權界面,用戶可以選擇是否使用微信登錄,如果選擇是,則直接進入到小程序。當你第二次進入該小程序的時候,你會發現授權界面不會彈出來了,直接就進入小程序了。 這個過程看起來非常的簡單,但其實實現起來相當的麻煩和繁瑣。涉及到會話、安全、驗證等各種各樣的問題。下面筆者介紹一下實現這個登錄過程的思路。 微信提供小程序登錄流程圖我們可以從 登錄流程時序 找到這張圖。想完全看懂張圖,需要了解很多東西。我們先來看看微信提供的幾個接口。 小程序接口介紹wx.login()這個方法是 小程序端 發起的,如果是使用騰訊團隊推出的小程序組件化開發框架的wepy的話,偽代碼如下: wepy.login() .then(res => { const code = res.code }) 這樣子就可以從微信平臺獲取一個code,這個code是 臨時登錄憑證 ,用于獲取 openid 的。 wx.request()這個也是 小程序端 發起的,用于請求開發者服務器(也即是我們的應用服務器)上的接口,調用的偽代碼如下: wepy.request({ url: `xxurl`, data: { //入參 }, }) .then(res => { //從res中獲取應用服務器返回的數據 }) 獲取openid的接口當某個開發主體開發了一個小程序后,當用戶訪問這個小程序的時候,微信平臺會為這個用戶分配一個openid。如下接口: 這個微信接口一般是我們的應用服務器發起調用的,而不是小程序端發起的。 wx.getUserInfogetUserInfo 這個接口用于在微信平臺獲取用戶信息。注意,如果微信用戶第一次訪問小程序,是彈出一個授權界面的。當用戶授權后,getUserInfo才能調用并返回用戶數據。 這個四個接口在使用微信訪問小程序的時候都會用到的。 基于token保持會話和登錄認證小程序雖然不支持cookie的機制,但是支持在header里設置token。 這個token是應用服務器生成的。 header: { 'xxxxtoken': token, } 當小程序調用應用服務器接口的時候,必須帶上這個token,應用服務端則對這個token進行解析和認證。 當然如果是第一次訪問小程序,只能由應用服務器先生成token。 筆者打算用偽代碼來表達使用token后,整個登錄的過程,因為用文字或者圖比較難表達。 const code = wx.login(); if (code ) {//code存在 //從小程序的本地中獲取toten const token = wx.getStorageSync('xxxxxtoken') if (token ) {//小程序本地存有token,無需彈出授權界面 //直接傳入code字段,調用應用服務器的驗證token的方法,如果校驗成功,需要返回用戶信息。 const userinfo = wx.request(http://xxxxxValidateToken(code )); if (userinfo) { //說明登錄成功,直接進入小程序的主界面。 } } else { //說明小程序本地沒有token,這個時候需要彈出授權界面,讓微信用戶決定是否訪問小程序,如果用戶選擇是的話。 const weixinuserinfo = wx.getUserInfo();//會彈出授權界面,微信提供的 if (weixinuserinfo ){ //生成或者驗證token const userinfo = wx.request(http://xxxxxValidateToken(code )); const token = userinfo.getToken(); //將token存儲到小程序本地 wx.setStorageSync('xxxxxtoken', token ) } } } 上面的偽代碼中,會調用應用服務器(我們的應用服務器)的 http://xxxxxValidateToken(code ) 方法。這個方法的實現邏輯大概如下: 1、先驗證這個微信用戶是否存在,可以調用微信提供的 jscode2session 方法,該方法會返回一個openid。我們必須在業務代碼里,將這個openid保存到數據庫,并和userid關聯起來。 2、判斷是否是新的用戶,如果是,則生成token和生成新的一個用戶信息存儲到數據庫。如果不是新的用戶,則驗證token。 這個流程走完后,小程序就可以通過 wx.request 方法,帶上token,真正的訪問應用服務器的業務方法,獲取業務數據。 token的生成和校驗見過有些公司是直接將userid和openid,加密后返回給小程序。也見過用userid和password加密后返回給小程序。如果是選擇第二種方式的話,驗證token的邏輯大概如下: 先解密,獲取userid和password,并根據userid從數據庫中獲取到用戶密碼,跟從token中解密出來的password進行比對,如果相等,則校驗通過。 總結現在再回頭看看微信提供登錄路程圖,是否好理解一些了。 |