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

簡單了解小程序+node梳理登陸流程

 更新時間:2019年06月24日 10:27:32   作者:三只萌新  
這篇文章主要介紹了簡單了解小程序+node梳理登陸流程,以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,,需要的朋友可以參考下

希望通過小程序+node來整體的了解下小程序登陸的流程。如有不對歡迎在評論區(qū)指出

1. client: wx.login()

wx.login({
success: ([code]) => {
// 發(fā)送 code 到后臺換取 openId, sessionKey, unionId
}
})

2. service: request()

服務端請求,需要的參數(shù)(js_code:client傳的code;appid:小程序唯一標識申請賬號時拿到;secret:小程序密鑰申請賬號時拿到;grant_type:默認值為 authorization_code)

// 請求方法
const request = require('request')
const url = https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
module.exports = {
async getSession(code) {
return new Promise((resolve, reject) => {
request(url,{
method: 'GET',
json: true
},
(error, res, body) => {
if (error) {
reject(error)
} else {
if (body.errcode) {
reject(new Error(body.errmsg))
} else {
resolve(body)
}
}
}
)
})
}
}

3.service:加密解密處理

const crypto = require('crypto')
const secret = '2019_06'
const algorithm = 'aes-256-cbc'
function encode(id) {
const encoder = crypto.createCipher(algorithm, secret)
const str = [id, Date.now(), '2019'].join('|')
let encrypted = encoder.update(str, 'utf8', 'hex')
encrypted += encoder.final('hex')
return encrypted
}
function decode(str) {
const decoder = crypto.createDecipher(algorithm, secret)
let decoded = decoder.update(str, 'hex', 'utf8')
decoded += decoder.final('utf8')
const arr = decoded.split('|')
return {
id: arr[0],
timespan: parseInt(arr[1])
}
}
module.exports = {
encode,
decode
}

4.service:返回登陸態(tài)

const { encode } = require('./lib/crypto')
const jsonMine = 'application/json'
const now = Date.now()
function handle(ctx, data, code = 0, message = 'success') {
ctx.type = jsonMine
ctx.body = {
code,
data,
message
}
}
router.get('/login', async (ctx, next) => {
const { code } = ctx.request.query
const session = await login(code)
if (session) {
const { session_key, openid } = session
// 查找數(shù)據(jù)庫中是否已經(jīng)存有openid,如果 hasOpenid 為null說明是新用戶
const hasOpenid = await User.findByPk(openid)
if(!hasOpenid){
// 數(shù)據(jù)庫存儲openid,時間戳
User.create({openid,timespan:Date.now()})
}
handle(ctx, { token: encode(openid) })
} else {
throw new Error('登陸失敗')
}
})

5.client:存儲登陸態(tài)在storage

import { LOGIN_TOKEN } from '../../utils/localStorage'
// 拿到token存儲到客戶端
wx.setStorageSync(LOGIN_TOKEN, token)

我在發(fā)起請求時將登陸態(tài)放在請求頭中,相應的服務端可以從請求頭中獲取

header: {
'x-session': wx.getStorageSync(LOGIN_TOKEN)
},

6.service:校驗登陸態(tài)

module.exports = async function(ctx, next) {
const sessionKey = ctx.get('x-session')
const { id, timespan } = decode(sessionKey)
// 查找數(shù)據(jù)庫中是否存在該 openid,返回是一個數(shù)組,如果不存在則返回[]
const targetList = await getOpenid(id)
if (targetList.length > 0) {
// 如果超過設定的過期時間,標記isExpired字段為登陸過期
const oneHour = 1000 * 60 * 60 * 24
if (Date.now() - timespan > oneHour) {
ctx.state.isExpired = true
// 跟前臺約定,如果code=2說明登陸過期跳登陸頁面
handle(ctx, '', 2, '登陸過期')
} else {
handle(ctx, '', 0, '登陸成功')
}
} else {
// 通過ctx.throw可以直接拋出錯誤
ctx.throw(401, '登陸失敗')
}

整體流程圖

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,

相關文章

  • 詳解nodejs解壓版安裝和配置(帶有搭建前端項目腳手架)

    詳解nodejs解壓版安裝和配置(帶有搭建前端項目腳手架)

    這篇文章主要介紹了詳解nodejs解壓版安裝和配置(帶有搭建前端項目腳手架) ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • 一文詳解Node.contain?函數(shù)兼容處理

    一文詳解Node.contain?函數(shù)兼容處理

    這篇文章主要為大家介紹了Node.contain?函數(shù)兼容處理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • 從零開始學習Node.js系列教程六:EventEmitter發(fā)送和接收事件的方法示例

    從零開始學習Node.js系列教程六:EventEmitter發(fā)送和接收事件的方法示例

    這篇文章主要介紹了Node.js EventEmitter發(fā)送和接收事件的方法,結合實例形式分析了EventEmitter發(fā)送和接收事件的原理、實現(xiàn)方法與相關操作技巧,需要的朋友可以參考下
    2017-04-04
  • Nodejs全局安裝和本地安裝的不同之處

    Nodejs全局安裝和本地安裝的不同之處

    這篇文章主要介紹了Nodejs全局安裝和本地安裝的不同之處的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • Node升級后vue項目node-sass報錯問題及解決

    Node升級后vue項目node-sass報錯問題及解決

    這篇文章主要介紹了Node升級后vue項目node-sass報錯問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 使用nvm管理多版本node的詳細教程

    使用nvm管理多版本node的詳細教程

    在開發(fā)工作中,經(jīng)常在不同的項目中使用不同版本的node去開發(fā),換一個項目在重新安裝node太麻煩,所以使用nvm來管理多版本的node開發(fā)環(huán)境,就非常方便了,所以本文給大家介紹了如何使用nvm管理多版本node,需要的朋友可以參考下
    2024-08-08
  • Thinkjs3新手入門之添加一個新的頁面

    Thinkjs3新手入門之添加一個新的頁面

    Thinkjs 是一個快速、簡單的基于MVC和面向對象的輕量級Node.js開發(fā)框架,下面這篇文章主要給大家介紹了關于Thinkjs3新手入門之添加一個新的頁面的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2017-12-12
  • node.js [superAgent] 請求使用示例

    node.js [superAgent] 請求使用示例

    這篇文章主要介紹了node.js [superAgent] 請求使用示例,分別給大家匯總了post請求、get請求、delete請求和put請求的示例,推薦給大家,希望大家能夠喜歡。
    2015-03-03
  • 使用pm2自動化部署node項目的方法步驟

    使用pm2自動化部署node項目的方法步驟

    這篇文章主要介紹了使用pm2自動化部署node項目的方法步驟,pm2是一個進程管理工具,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • node.js中的console.info方法使用說明

    node.js中的console.info方法使用說明

    這篇文章主要介紹了node.js中的console.info方法使用說明,本文介紹了console.info的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12

最新評論

惠东县| 类乌齐县| 正镶白旗| 通海县| 池州市| 称多县| 延寿县| 祁门县| 岳阳县| 财经| 集安市| 常德市| 揭东县| 拉萨市| 广丰县| 常熟市| 东港市| 宁夏| 筠连县| 双流县| 漯河市| 黑山县| 大兴区| 宜州市| 横峰县| 栾城县| 屯门区| 旬邑县| 依安县| 岐山县| 雅江县| 闽清县| 长寿区| 基隆市| 磐安县| 弥渡县| 运城市| 新干县| 新邵县| 琼海市| 敦煌市|