koa2+mongo實現(xiàn)小程序同步登陸入庫(附輪子)

近期業(yè)務(wù)用到微信登陸并同步mongo數(shù)據(jù)庫,但目前微信官方只給了wafer2-quickstart-nodejs這個koa2+mysql方案,google+git也并沒有找到輪子或方案,就自己寫了個輪子(附小程序demo)
地址:https://github.com/seawind8888/weapp-node-mongo-scaffold

同步流程

微信官方文檔只給了微信登錄流程圖,但并沒有給出同步數(shù)據(jù)庫登錄的流程。并且各種openId、sessionKey、iv等相關(guān)的鑒權(quán)字段也是搞得人很懵逼,按照自己輪流程做了個圖,供參考

image

效果實現(xiàn)

先啟動項目

  1. 使用微信開發(fā)者工具導(dǎo)入項目目錄下example項目,并填入自己申請的AppID

  2. 進(jìn)入項目,關(guān)閉詳情 - 不校驗合法域名

    image

  3. 點(diǎn)擊微信同步登陸,提示用戶入庫成功,并返回session_key和token(可存入storage并加入請求header)


    image
  4. mongo入庫用戶信息成功


    image

Tips: 客戶端調(diào)用wx.login生成token,實際有兩個鑒權(quán)邏輯(微信鑒權(quán),客戶端交互token鑒權(quán)),客戶端可先使用wx.checkSession判斷微信鑒權(quán),再獲取客戶端鑒權(quán)

同步實現(xiàn)邏輯

loginAction = async (ctx) => { 
    // 調(diào)用/user/login
    const {
      encryptedData,
      code,
      iv
    } = ctx.query
    const {
      AppID,
      AppSecret
    } = config.weapp
    // 開始獲取openId && session_key
    const resultData = await this.getAppId({
      appid: AppID,
      secret: AppSecret,
      code: code
    });
    // 解密微信簽名,獲取用戶信息
    const decode = new WXBizDataCrypt(AppID, resultData.session_key)
    const userInfo = decode.decryptData(encryptedData, iv)

    // 引入小程序用戶的model
    const WeChatUser = mongoose.model('User');
    
    // 查詢用戶信息
    await WeChatUser.findOne({
        openid: resultData.openid
      })
      .exec()
      .then(async result => {
       
        // 設(shè)置token格式
        const userToken = {
          openid: resultData.openid
        }
        if (!result) {
          // 首次登錄生成token, 有效期為24小時?
          const token = jwt.sign(userToken, secret, {
            expiresIn: 60 * 60 * 24
          })
          const NewWechatUser = new WeChatUser({
            // 用戶信息入庫
            avatar: userInfo.avatarUrl,
            nickName: userInfo.nickName,
            openid: resultData.openid,
            token: token
          });
          try {
            const _save = await NewWechatUser.save()
            console.log('[mongoSave]', _save)
               //成功返回code=200,并返回成sessionKey
            ctx.body = {
              statusCode: 200,
              message: '登錄成功, 用戶信息入庫成功',
              Token: token,
              sessionKey: resultData.session_key
            };
          } catch (error) {   //失敗返回code=500,并返回錯誤信息 
            console.log('[tokenSave]', error)
            ctx.body = {
              statusCode: 500,
              message: '參數(shù)錯誤',
              data: error
            }
          }
           
        } else { // 已添加token
          const token = result.token
          try {
            // token校驗
            await jwt.verify(token, secret)
            ctx.body = {
              statusCode: 200,
              message: '登錄成功,用戶已入庫',
              Token: token,
              sessionKey: resultData.session_key
            };
          } catch (err) {
            if (err && err.name == 'TokenExpiredError') {
               // token失效
              const token = jwt.sign(userToken, secret, {
                expiresIn: 60 * 60 * 24
              })
              // 更新token
              
              const _update = WeChatUser.updateOne(secret, token)
              console.log('[mongoUpdate]', _update)
              ctx.body = {
                statusCode: 200,
                message: '登錄成功,Token更新成功',
                Token: token,
                sessionKey: resultData.session_key
              };
            } else {
              console.log('[tokenVerify]', error)
              ctx.body = {
                statusCode: 500,
                message: '服務(wù)器內(nèi)部錯誤',
                data: error
              }
            };
          }
        }
      });
  }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 先引入JS 文件 this.wxShare() 在created里調(diào)用 首先登陸微信公眾號 JSSDK使用步驟 步...
    寄魚予海與你閱讀 6,961評論 1 3
  • 小程序面試題 小程序授權(quán)登錄流程 0、如何獲得用戶信息...
    X秀秀閱讀 1,897評論 0 8
  • 什么是微信小程序 騰訊公司于2016年9月21日開始微信小程序內(nèi)測,一時間小程序的討論熱度不斷。網(wǎng)絡(luò)上流傳一張張小...
    centuryscr閱讀 5,808評論 0 3
  • 目錄:一、無處不在的鑒權(quán) 現(xiàn)實生活中的身份鑒權(quán)方法 簡單的密碼鑒權(quán)體系二、鑒權(quán)優(yōu)化 頻繁的鑒權(quán)場景下的優(yōu)化方案 第...
    宮若石閱讀 445評論 0 1
  • 1. 準(zhǔn)備工作 1.1 查看公眾號分享接口權(quán)限 要使用微信SDK必須要有經(jīng)過微信認(rèn)證的非個人服務(wù)號 登陸服務(wù)號后,...
    sxplus閱讀 6,724評論 0 2

友情鏈接更多精彩內(nèi)容