Полный анализ входа в апплет и расшифровки данных

задняя часть внешний интерфейс сервер WeChat
Полный анализ входа в апплет и расшифровки данных

По незнанию месяц ничего не писала Грех прожить такой развратный день.

Что ж, вернемся к основному тексту, поговорим о нашем апплете.

отдать дань уважения

Большая часть логического кода для входа исходит изРука об руку научит вас аутентификации при входе в апплет

Процесс входа

На картинке выше показан официальный процесс входа в систему, давайте посмотрим на логику.

1. Использование пользователемwx.loginполучить временныйcode, действует 5 минут

2. будет временноcodeОтправьте его в нашу внутреннюю службу и вызовите API WeChat, чтобы получитьsession_keyа такжеopenid

3. Серверная часть настраивает новый ключ и связывает возвращенный ключsession_keyа такжеopenid, который возвращает новый ключ интерфейсу

4. Когда интерфейс отправляет запрос, он несет ключ, а сервер анализирует и возвращает данные.

session_key и openid

1,session_keyСеансовый ключ используется для определения правильности операции сеанса, а также для шифрования и расшифровки пользовательских данных.Сервер может хранить его сам.Ключ не должен возвращаться во внешний интерфейс и диалог для использования.

2,openidУникальный идентификатор пользователя, также используемый только для сервера, может использоваться для идентификации уникальности пользователя.

Далее поговорим об их приобретении, которое получается путем вызова WeChat API с сервера.

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

Параметры следующие:

// 小程序页面
wx.login({
	success:(ret)=>{
		wx.request({
			url: 'http://test.com', // 后端服务器
			data:{
				code : ret.code
			}
		})
	}
})

Бэкенд-сервисы, которые мы используемrequestмодуль для отправки запроса

// 后端服务
let options = {
  url: 'https://api.weixin.qq.com/sns/jscode2session',
  qs:{
      appid: appid,  
      secret: secret,
      js_code: code,
      grant_type:'authorization_code'
  }
}

// 默认请求方式是get
request(options, (err, response, body) => {
	if(err) return err
	return body  // {openid:'openid', session_key:'session_key'} 不是真正的返回 看下面的代码
})

Сгенерировать новый ключевой ключ

Мы получили session_key и openid выше, а следующие два слова называются keyID.Затем мы генерируем новый ключ и возвращаем его во внешний интерфейс и связываем новый ключ с keyID.

Генерируем ключ по алгоритму sha1 криптомодуля

const crypto = require('crypto')

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

Когда приведенный выше код вернется, мы изменим его на этот новый ключ. Внешний интерфейс сохранит этот ключ в хранилище и предоставит этот ключ при запросе на завершение пользовательского состояния входа в систему.

wx.checkSession

Он используется для проверки правильности ключа сеанса текущего пользователя. WeChat не будет информировать разработчика о сроке действия ключа сеанса. Чем чаще пользователь использует апплет, тем дольше будет срок действия ключа сеанса.

wx.checkSession({
	success:function(){  // 当前session_key有效
		... // 可以写我们的业务代码
	},
	fail:function(){   // 当前session_key已过期
		wx.login()  // 重新登录,获取新的session_key
	}
})

Когда срок действия session_key истекает, мы вызываем API входа в систему, обновляем session_key, чтобы сгенерировать новый ключ, и связываем отношения между ними.

Инкапсуляция служебных функций

Ранее мы примерно перечислили процесс, а потом написали вышеописанный процесс как публичную функцию


// 验证session_key状态
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:'本地服务地址',
					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失效')
        }
      })
    })

	}
}

внутренний код

использование серверной частикоа кадр, см. код в конце текстаgithubадрес

расшифровать

Официально предоставляет образцы кода на нескольких языках программирования.нажмите, чтобы скачать

Здесь мы используем WeChat Sports API в качестве примера.

var app = getApp()  // 我们将工具函数都放在了app的示例上面
Page({
	onLoad:function(){
		app.Util.login().then(_ => {  // 先登录然后获取数据
      this.getrunData()
    })
	},
	getrunData(){
    wx.getWeRunData({
      success: (ret) => {
        app.Util.ajax('本地服务地址', { iv: ret.iv, data: ret.encryptedData}, 'post').then(_=>{
          console.log(_)
        }, (err)=>{
          console.log(err)
        })
      }
    })
  },

})

Результат возврата следующий

Выше мы завершили простую аутентификацию входа и расшифровку данных апплета.

Рендеринг городского здания

конец

Для аутентификации входа мы просто помещаем состояние пользователя в память.В реальном проекте оно должно быть помещено в базу данных.Вы можете прочитать его.Статья о Великом Боге, в котором рассказывается о работе базы данных.

Салют снова

Пожалуйста, нажмите на полный код этой статьиgithub