成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

小程序的登錄和數(shù)據(jù)解密全解析

shadajin / 562人閱讀

摘要:好了,回到正文來,聊咱們的小程序。致敬登錄大部分邏輯代碼統(tǒng)統(tǒng)來自手把手教會(huì)你小程序登錄鑒權(quán)登錄流程上圖是官方給出的登錄流程,我們來捋下邏輯。用來校驗(yàn)當(dāng)前用戶的是否有效,微信不會(huì)把的有效期告知開發(fā)者,用戶越頻繁使用小程序,有效期越長。

不知不覺已經(jīng)一個(gè)月沒有寫東西了,墮落的日子居然過的這么心(chou)安(bu)理(yao)得(lian),罪過啊。

好了,回到正文來,聊咱們的小程序。

致敬

登錄大部分邏輯代碼統(tǒng)統(tǒng)來自手把手教會(huì)你小程序登錄鑒權(quán)

登錄流程

上圖是官方給出的登錄流程,我們來捋下邏輯。

1、用戶使用wx.login獲取臨時(shí)code,有效期為5分鐘

2、將臨時(shí)code傳到我們自己的后端服務(wù),調(diào)用微信的API獲取用戶的session_keyopenid

3、后端自定義新的密鑰并關(guān)聯(lián)返回的session_keyopenid,將新的密鑰返給前端

4、前端發(fā)送請求的時(shí)候,帶著密鑰,后端進(jìn)行解析后返回?cái)?shù)據(jù)

session_key和openid

1、session_key會(huì)話密鑰,用來確定會(huì)話的操作的有效性和用來加密解密用戶數(shù)據(jù),服務(wù)器自己存儲(chǔ)即可,不應(yīng)該將密鑰返給前端和對話使用

2、openid用戶唯一標(biāo)識,同樣只用于服務(wù)器,可以用來標(biāo)識用戶的唯一性

接下來,我們說下它們的獲取,通過服務(wù)端調(diào)用微信API獲取

API:https://api.weixin.qq.com/sns/jscode2session

參數(shù)如下:

// 小程序頁面
wx.login({
    success:(ret)=>{
        wx.request({
            url: "http://test.com", // 后端服務(wù)器
            data:{
                code : ret.code
            }
        })
    }
})

后端服務(wù)我們使用request模塊來發(fā)送請求

// 后端服務(wù)
let options = {
  url: "https://api.weixin.qq.com/sns/jscode2session",
  qs:{
      appid: appid,  
      secret: secret,
      js_code: code,
      grant_type:"authorization_code"
  }
}

// 默認(rèn)請求方式是get
request(options, (err, response, body) => {
    if(err) return err
    return body  // {openid:"openid", session_key:"session_key"} 不是真正的返回 看下面的代碼
})
生成新的密鑰 skey

上面我們獲取了session_key和openid,下文兩個(gè)字?jǐn)喾QkeyID,接下來我們生成一個(gè)新的密鑰返回前端并將新密鑰關(guān)聯(lián)keyID。

我們使用crypto模塊的sha1算法生成密鑰

const crypto = require("crypto")

function getShaKey(data){
    return crypto.createHash("sha1").update(data, "utf8").digest("hex")
}

上面的代碼返回我們就改成這個(gè)新的skey,前端將這個(gè)密鑰存在storage里面,請求的時(shí)候帶上這個(gè)skey,就完成了自定義登錄態(tài)。

wx.checkSession

用來校驗(yàn)當(dāng)前用戶的session_key是否有效,微信不會(huì)把session_key的有效期告知開發(fā)者,用戶越頻繁使用小程序,session_key有效期越長。

wx.checkSession({
    success:function(){  // 當(dāng)前session_key有效
        ... // 可以寫我們的業(yè)務(wù)代碼
    },
    fail:function(){   // 當(dāng)前session_key已過期
        wx.login()  // 重新登錄,獲取新的session_key
    }
})

當(dāng)session_key過期的時(shí)候,我們調(diào)用登錄API,更新session_key生成新的skey,并關(guān)聯(lián)二者關(guān)系。

工具函數(shù)的封裝

前面我們將流程大概串了下,接下來我們把上面的流程寫成寫成公用的函數(shù)

// 驗(yàn)證session_key狀態(tài)
function checkSession(){
    return new Promise((resolve, reject) => {
        wx.checkSession({
            success:function(){
                resolve(true)
            },
            fail:function(){
                reject(false)
            }
        })
    })
}

// 登錄

function login(){
    return new Promise((resolve, reject) => {
        wx.login({
            success: (ret) => {
                wx.request({
                    url:"本地服務(wù)地址",
                    method: "POST",
                    data:{
                        code: ret.code
                    },
                    success: (response) =>{
                        wx.setStorageSync("skey", response.data.key)  // 將skey存在storage里面
                        resolve(response.data.key)
                    }
                    
                })
            }
        })
        
    })
}

// 請求

function ajax(url, data, method="GET", config={}){
    let skey = wx.getStorageSync("skey") // 獲取skey
    if(!skey){  // 沒有skey,首次登錄
        return new Promise((resolve, reject) => {
            login()
            reject("請登錄")
        })
    } else {
        return new Promise((resolve, reject) => {
      checkSession().then( _=> {
        if (_){ // session_key有效
          wx.request({
            url,
            method: method.toLocaleUpperCase(),
            data,
            header: Object.assign({}, { skey }, config),
            success: (ret) => {
              resolve(ret.data)
            }
          })
        } else { // session_key失效
          login()
          reject("session_key失效")
        }
      })
    })

    }
}
后端代碼

后端使用koa框架,代碼見文末github地址

解密

官方提供了多種編程語言的示例代碼點(diǎn)擊下載

這里我們使用微信運(yùn)動(dòng)API為例

var app = getApp()  // 我們將工具函數(shù)都放在了app的示例上面
Page({
    onLoad:function(){
        app.Util.login().then(_ => {  // 先登錄然后獲取數(shù)據(jù)
      this.getrunData()
    })
    },
    getrunData(){
    wx.getWeRunData({
      success: (ret) => {
        app.Util.ajax("本地服務(wù)地址", { iv: ret.iv, data: ret.encryptedData}, "post").then(_=>{
          console.log(_)
        }, (err)=>{
          console.log(err)
        })
      }
    })
  },

})

返回結(jié)果如下

以上,我們完成了小程序簡單的登錄鑒權(quán)和數(shù)據(jù)解密

效果圖鎮(zhèn)樓

結(jié)尾

登錄鑒權(quán)我們只是將用戶狀態(tài)放在了內(nèi)存里,實(shí)際項(xiàng)目中肯定要放在數(shù)據(jù)庫中,可以拜讀下大神文章,里面說到了數(shù)據(jù)庫的操作。

再次致敬

本文完整代碼請戳github

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/94501.html

相關(guān)文章

  • 微信程序Java登錄流程(ssm實(shí)現(xiàn)具體功能解密隱私信息問題解決方案)

    摘要:文章有不當(dāng)之處,歡迎指正,如果喜歡微信閱讀,你也可以關(guān)注我的微信公眾號好好學(xué),獲取優(yōu)質(zhì)學(xué)習(xí)資源。一登錄流程圖二小程序客戶端獲取用戶信息非必填默認(rèn)為請求服務(wù)端的登錄接口臨時(shí)登錄憑證用戶非敏感信息簽名用戶敏感信息解密算法的向量調(diào)用服務(wù)端登錄接口 文章有不當(dāng)之處,歡迎指正,如果喜歡微信閱讀,你也可以關(guān)注我的微信公眾號:好好學(xué)java,獲取優(yōu)質(zhì)學(xué)習(xí)資源。 一、登錄流程圖 showImg(htt...

    QiShare 評論0 收藏0
  • 程序登錄、微信網(wǎng)頁授權(quán)(Java版)

    摘要:小程序登錄微信網(wǎng)頁授權(quán)版首先呢,登錄授權(quán)授權(quán)登錄,是一樣的意思,不用糾結(jié)。寫小程序授權(quán)登錄的代碼前,需要了解清楚與的區(qū)別,這里再簡單介紹一下騰訊有個(gè)微信開放平臺(tái),只有企業(yè)才能注冊賬號,可理解為微信體系里,最頂級的賬號。 小程序登錄、微信網(wǎng)頁授權(quán)(Java版) 首先呢,登錄、授權(quán)、授權(quán)登錄,是一樣的意思,不用糾結(jié)。 寫小程序授權(quán)登錄的代碼前,需要了解清楚openid與unionid的區(qū)別...

    joywek 評論0 收藏0
  • 微信程序開發(fā):python+sanic 實(shí)現(xiàn)程序登錄注冊

    摘要:參考鏈接微信小程序七日談第五天你可能要在登錄功能上花費(fèi)大力氣理解認(rèn)證及實(shí)踐網(wǎng)站微信登錄實(shí)現(xiàn)最后,感謝女朋友支持。 開發(fā)微信小程序時(shí),接入小程序的授權(quán)登錄可以快速實(shí)現(xiàn)用戶注冊登錄的步驟,是快速建立用戶體系的重要一步。這篇文章將介紹 python + sanic + 微信小程序?qū)崿F(xiàn)用戶快速注冊登錄全棧方案。 微信小程序登錄時(shí)序圖如下: showImg(https://segmentfaul...

    antz 評論0 收藏0
  • 微信程序開發(fā):python+sanic 實(shí)現(xiàn)程序登錄注冊

    摘要:參考鏈接微信小程序七日談第五天你可能要在登錄功能上花費(fèi)大力氣理解認(rèn)證及實(shí)踐網(wǎng)站微信登錄實(shí)現(xiàn)最后,感謝女朋友支持。 開發(fā)微信小程序時(shí),接入小程序的授權(quán)登錄可以快速實(shí)現(xiàn)用戶注冊登錄的步驟,是快速建立用戶體系的重要一步。這篇文章將介紹 python + sanic + 微信小程序?qū)崿F(xiàn)用戶快速注冊登錄全棧方案。 微信小程序登錄時(shí)序圖如下: showImg(https://segmentfaul...

    Nino 評論0 收藏0
  • 微信程序授權(quán)登錄解密unionId出錯(cuò)

    摘要:注沒有在微信開放平臺(tái)做開發(fā)者資質(zhì)認(rèn)證的就不要浪費(fèi)時(shí)間了,沒認(rèn)證無法獲取,認(rèn)證費(fèi)用元年,微信授權(quán)登錄流程第一步獲取用戶臨時(shí)登錄憑證第二步獲取加密過的數(shù)據(jù)和解密參數(shù)第三步把步驟一二中的傳到開發(fā)者自己服務(wù)端第三步服務(wù)端獲取到之后用方法請求如下微信 注:沒有在微信開放平臺(tái)做開發(fā)者資質(zhì)認(rèn)證的就不要浪費(fèi)時(shí)間了,沒認(rèn)證無法獲取unionId,認(rèn)證費(fèi)用300元/年,emmmm.... 微信授權(quán)登錄流程...

    tinysun1234 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<