最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

微信小程序中做用戶登錄與登錄態(tài)維護(hù)的實(shí)現(xiàn)詳解

 更新時(shí)間:2017年05月17日 09:13:29   作者:一斤代碼  
微信小程序的運(yùn)行環(huán)境不是在瀏覽器下運(yùn)行的。所以不能以cookie來(lái)維護(hù)登錄態(tài)。下面這篇文章主要給大家介紹了微信小程序中如何做用戶登錄與登錄態(tài)維護(hù)的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考學(xué)習(xí)。

總結(jié)

大家都知道,在開(kāi)發(fā)中提供用戶登錄以及維護(hù)用戶的登錄狀態(tài),是一個(gè)擁有用戶系統(tǒng)的軟件應(yīng)用普遍需要做的事情。像微信這樣的一個(gè)社交平臺(tái),如果做一個(gè)小程序應(yīng)用,我們可能很少會(huì)去做一個(gè)完全脫離和舍棄連接用戶信息的純工具軟件。

讓用戶登錄,標(biāo)識(shí)用戶和獲取用戶信息,以用戶為核心提供服務(wù),是大部分小程序都會(huì)做的事情。我們今天就來(lái)了解下在小程序中,如何做用戶登錄,以及如何去維護(hù)這個(gè)登錄后的會(huì)話(Session)狀態(tài)。下面來(lái)看看詳細(xì)的介紹:

在微信小程序中,我們大致會(huì)涉及到以下三類(lèi)登錄方式:

  • 自有的賬號(hào)注冊(cè)和登錄
  • 使用其他第三方平臺(tái)賬號(hào)登錄
  • 使用微信賬號(hào)登錄(即直接使用當(dāng)前已登錄的微信賬號(hào)來(lái)作為小程序的用戶進(jìn)行登錄)

第一和第二種方式是目前Web應(yīng)用中最常見(jiàn)的兩種方式,在微信小程序中同樣可以使用,但是需要值的注意的是,小程序中沒(méi)有Cookie的機(jī)制,所以在使用這2種方式前,請(qǐng)確認(rèn)你們或第三方的API是否需要依賴Cookie;還有小程序中也不支持HTML頁(yè)面,那些需要使用頁(yè)面重定向來(lái)進(jìn)行登錄的第三方API就需要改造,或不能用了。

我們今天主要來(lái)討論一下第三種方式,即如何使用微信賬號(hào)進(jìn)行登錄,因?yàn)檫@種方式和微信平臺(tái)結(jié)合最緊密,用戶體驗(yàn)比較好。

登錄流程

引用小程序官方文檔的登錄流程圖,整個(gè)登錄流程基本如下圖所示:


登錄流程圖

該圖中,“小程序”指的就是我們使用小程序框架寫(xiě)的代碼部分,“第三方服務(wù)器”一般就是我們自己的后臺(tái)服務(wù)程序,“微信服務(wù)器”是微信官方的API服務(wù)器。

下面我們來(lái)逐步分解一下這個(gè)流程圖。

步驟1:在客戶端獲取當(dāng)前登錄微信用戶的登錄憑證(code)

在小程序中登錄的第一步,就是先獲取登錄憑證。我們可以使用wx.login()方法并得到一個(gè)登錄憑證。

我們可以在小程序的App代碼中發(fā)起登錄憑證請(qǐng)求,也可以在其他任何Page頁(yè)面代碼中發(fā)起登錄憑證請(qǐng)求,主要根據(jù)你小程序的實(shí)際需要。

App({
 onLaunch: function() {
 wx.login({
  success: function(res) {
  var code = res.code;
  if (code) {
   console.log('獲取用戶登錄憑證:' + code);
  } else {
   console.log('獲取用戶登錄態(tài)失?。? + res.errMsg);
  }
  }
 });
 }
})

步驟2:將登錄憑證發(fā)往你的服務(wù)端,并在你的服務(wù)端使用該憑證向微信服務(wù)器換取該微信用戶的唯一標(biāo)識(shí)(openid)和會(huì)話密鑰(session_key)

首先,我們使用wx.request()方法,請(qǐng)求我們自己實(shí)現(xiàn)的一個(gè)后臺(tái)API,并將登錄憑證(code)攜帶過(guò)去,例如在我們前面代碼的基礎(chǔ)上增加:

App({
 onLaunch: function() {
 wx.login({
  success: function(res) {
  var code = res.code;
  if (code) {
   console.log('獲取用戶登錄憑證:' + code);

   // --------- 發(fā)送憑證 ------------------
   wx.request({
   url: 'https://www.my-domain.com/wx/onlogin',
   data: { code: code }
   })
   // ------------------------------------

  } else {
   console.log('獲取用戶登錄態(tài)失?。? + res.errMsg);
  }
  }
 });
 }
})

你的后臺(tái)服務(wù)(/wx/onlogin)接著需要使用這個(gè)傳遞過(guò)來(lái)的登錄憑證,去調(diào)用微信接口換取openid和session_key,接口地址格式如下所示:

https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

這里是我使用了Node.js Express構(gòu)建的后臺(tái)服務(wù)的代碼,僅供參考:

router.get('/wx/onlogin', function (req, res, next) {
 let code = req.query.code

 request.get({
 uri: 'https://api.weixin.qq.com/sns/jscode2session',
 json: true,
 qs: {
  grant_type: 'authorization_code',
  appid: '你小程序的APPID',
  secret: '你小程序的SECRET',
  js_code: code
 }
 }, (err, response, data) => {
 if (response.statusCode === 200) {
  console.log("[openid]", data.openid)
  console.log("[session_key]", data.session_key)

  //TODO: 生成一個(gè)唯一字符串sessionid作為鍵,將openid和session_key作為值,存入redis,超時(shí)時(shí)間設(shè)置為2小時(shí)
  //偽代碼: redisStore.set(sessionid, openid + session_key, 7200)

  res.json({ sessionid: sessionid })
 } else {
  console.log("[error]", err)
  res.json(err)
 }
 })
})

這段后臺(tái)代碼成功執(zhí)行的話,就可以得到openid和session_key。這個(gè)信息就是當(dāng)前微信賬戶在微信服務(wù)器那邊的登錄態(tài)了。

但是,為了安全方面的原因,請(qǐng)不要直接使用這些信息作為你小程序的用戶標(biāo)識(shí)和session標(biāo)識(shí)回傳到小程序客戶端中去,我們應(yīng)該在服務(wù)器端做一層自己的session,將這個(gè)微信賬號(hào)登錄態(tài)生成一個(gè)session id并維護(hù)在我們自己的session機(jī)制中,然后把這個(gè)session id派發(fā)到小程序客戶端作為session標(biāo)識(shí)來(lái)使用。

關(guān)于如何在服務(wù)器端做這個(gè)session機(jī)制,我們現(xiàn)在一般采用鍵值對(duì)存儲(chǔ)工具來(lái)做,比如redis。我們?yōu)槊總€(gè)session生成一個(gè)唯一的字符串作為鍵,然后可以將session_key和openid作為值,存入redis中,為了安全,存入的時(shí)候還應(yīng)設(shè)置一個(gè)超時(shí)的時(shí)間。

步驟3:在客戶端保存sessionid

開(kāi)發(fā)Web應(yīng)用的時(shí)候,在客戶端(瀏覽器)中,我們通常將session id存放在cookie中,但是小程序沒(méi)有cookie機(jī)制,所以不能采用cookie了,但是小程序有本地的storage,所以我們可以使用storage來(lái)保存sessionid,以供后續(xù)的后臺(tái)API調(diào)用所使用。

在之后,調(diào)用那些需要登錄后才有權(quán)限的訪問(wèn)的后臺(tái)服務(wù)時(shí),你可以將保存在storage中的sessionid取出并攜帶在請(qǐng)求中(可以放在header中攜帶,也可以放在querystring中,或是放在body中,根據(jù)你自己的需要來(lái)使用),傳遞到后臺(tái)服務(wù),后臺(tái)代碼中獲取到該sessionid后,從redis中查找是否有該sessionid存在,存在的話,即確認(rèn)該session是有效的,繼續(xù)后續(xù)的代碼執(zhí)行,否則進(jìn)行錯(cuò)誤處理。

這是一個(gè)需要session驗(yàn)證的后臺(tái)服務(wù)示例,我的sessionid是放在header中傳遞的,所以在這個(gè)示例中,是從請(qǐng)求的header中獲取sessionid:

router.get('/wx/products/list', function (req, res, next) {
 let sessionid = req.header("sessionid")
 let sessionVal = redisStore.get(sessionid)

 if (sessionVal) {
 // 執(zhí)行其他業(yè)務(wù)代碼
 } else {
 // 執(zhí)行錯(cuò)誤處理
 }
})

好了,通過(guò)微信賬號(hào)進(jìn)行小程序登錄和狀態(tài)維護(hù)的簡(jiǎn)單流程就是這樣,了解這些知識(shí)點(diǎn)之后,再基于此進(jìn)行后續(xù)的開(kāi)發(fā)就會(huì)變得更容易了。

另外,騰訊前端團(tuán)隊(duì)也開(kāi)源了他們封裝的相關(guān)庫(kù),可以借鑒和使用。

服務(wù)器端庫(kù) weapp-session

小程序端庫(kù) weapp-session-client

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • layer.alert自定義關(guān)閉回調(diào)事件的方法

    layer.alert自定義關(guān)閉回調(diào)事件的方法

    今天小編就為大家分享一篇layer.alert自定義關(guān)閉回調(diào)事件的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-09-09
  • JS實(shí)現(xiàn)的找零張數(shù)最小問(wèn)題示例

    JS實(shí)現(xiàn)的找零張數(shù)最小問(wèn)題示例

    這篇文章主要介紹了JS實(shí)現(xiàn)的找零張數(shù)最小問(wèn)題,涉及javascript數(shù)學(xué)運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11
  • JS正則表達(dá)式封裝與使用操作示例

    JS正則表達(dá)式封裝與使用操作示例

    這篇文章主要介紹了JS正則表達(dá)式封裝與使用操作,涉及javascript使用正則表達(dá)式針對(duì)郵箱、手機(jī)號(hào)、身份證、用戶名、中文等簡(jiǎn)單驗(yàn)證操作技巧,需要的朋友可以參考下
    2019-05-05
  • 使用JavaScript刪除HTML元素的2種方法及3種情況

    使用JavaScript刪除HTML元素的2種方法及3種情況

    給定一個(gè)HTML元素,如何使用JavaScript從文檔中刪除該HTML元素,這篇文章主要給大家介紹了關(guān)于使用JavaScript刪除HTML元素的2種方法及3種情況,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • javascript實(shí)現(xiàn)數(shù)字時(shí)鐘特效

    javascript實(shí)現(xiàn)數(shù)字時(shí)鐘特效

    這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)數(shù)字時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • js 分頁(yè)全選或反選標(biāo)識(shí)實(shí)現(xiàn)代碼

    js 分頁(yè)全選或反選標(biāo)識(shí)實(shí)現(xiàn)代碼

    分頁(yè)全選或反選標(biāo)識(shí) 對(duì)多選按鈕操作。 批量全選添加、批量移除。 行單選添加、移除。 分頁(yè)之后(全選或不選)狀態(tài)標(biāo)識(shí)依然存在
    2011-08-08
  • Bootstrap組件系列之福利篇幾款好用的組件(推薦二)

    Bootstrap組件系列之福利篇幾款好用的組件(推薦二)

    這篇文章主要介紹了Bootstrap組件系列之福利篇幾款好用的組件(推薦二)的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • NestJs 靜態(tài)目錄配置詳解

    NestJs 靜態(tài)目錄配置詳解

    這篇文章主要介紹了NestJs 靜態(tài)目錄配置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • echarts安裝與配置

    echarts安裝與配置

    這篇文章介紹了echarts安裝與配置的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 小程序?qū)崿F(xiàn)列表多個(gè)批量倒計(jì)時(shí)

    小程序?qū)崿F(xiàn)列表多個(gè)批量倒計(jì)時(shí)

    這篇文章主要為大家詳細(xì)介紹了小程序?qū)崿F(xiàn)列表多個(gè)批量倒計(jì)時(shí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02

最新評(píng)論

治多县| 太白县| 旬邑县| 静宁县| 凌海市| 太和县| 丹巴县| 贵南县| 监利县| 新蔡县| 舟山市| 龙井市| 青浦区| 镇雄县| 新兴县| 桐乡市| 冷水江市| 沁阳市| 平罗县| 揭西县| 离岛区| 徐闻县| 吕梁市| 宁陕县| 兴业县| 本溪| 荃湾区| 永登县| 五指山市| 鄢陵县| 石景山区| 故城县| 上杭县| 台州市| 本溪市| 合水县| 红河县| 博乐市| 呼玛县| 林周县| 凭祥市|