小程序实现授权登陆的解决方案


Posted in Javascript onDecember 02, 2018

前言

之前写过一个关于微信授权登陆的文章

传送门

最近在做小程序的项目,依旧是商城,又开始研究微信的登陆授权坑,第一次接触小程序,授权登陆也是一塌糊涂以后再慢慢的改进

场景

  • 微信用户可以通过搜索进入小程序
  • 也可以通过别人分享进入小程序
  • 进入小程序之后需要用户授权拿到用户信息进行注册

代码实现

初始化页面home页用户第一次进入小程序必须授权后台注册并登陆

app.json

{
"pages": [
  "pages/home/index", 
  "pages/login/index",
   ...
  ]
}

login.js逻辑进入页面判断一下是不是授权过,判断用户是否已经授权,已经授权显示登陆,没有授权显示授权,用户无论是注册还是登陆用的是后台提供的同一个接口。返回token存在本地

login.js

const App = getApp()
import { loginModel } from '../../models/login.js'
import { MineModel } from '../../models/mine.js'
import { encodeUnicode } from '../../utils/index.js'
const ModelLogin = new loginModel()
const Modelmine = new MineModel()
Page({
 data: {
  logged: !1,
  isauth: false,
  locked: false
 },
 onLoad: function(options) {
  // 返回到之前要刷新
  var pages = getCurrentPages() // 获取页面栈
  var prevPage = pages[pages.length - 2] // 前一个页面
  prevPage.setData({
   isBack: true
  })
 },
 onShow: function() {
  // 如果已经授权则显示登录,直接登录不调用授权
  App.WxService.getSetting().then(res => {
   if (res.authSetting['scope.userInfo']) {
    this.setData({
     isauth: true
    })
   }
  })
  //token 不能在page外面定义,变量写在 page 外面有缓存
  const token = App.WxService.getStorageSync('utoken')
  // 如果有token显示已经授权
  this.setData({
   logged: !!token
  })
  token && setTimeout(this.goBack, 1500)
 },
 login() {
  this.wechatSignUp()
 },
 goBack() {
  // 返回登录之前的页面
  wx.navigateBack({
   delta: 1
  })
 },
 // 登陆注册
 wechatSignUp(cd) {
  // 上锁如果正在请求接口那么就返回
  if (this.data.locked) {
   return
  }
  this.data.locked = true
  //注册或者登陆获取token
  let code = ''
  App.WxService
   .login()
   .then(data => {
    code = data.code
    wx.setStorageSync('logincode', data.code)
    return App.WxService.getUserInfo()
   })
   .then(data => {
    // 请求后台登录注册接口
    return ModelLogin.wechatSignUp({
     encrypteData: data.encryptedData,
     iv: data.iv,
     rawData: encodeUnicode(data.rawData), // 编码
     signature: data.signature,
     code: code
    })
   })
   .then(data => {
    this.data.locked = false
    if (data.data.token == '') {
     wx.showToast({
      title: '登录失败',
      icon: 'none'
     })
     return
    }
    App.WxService.setStorageSync('utoken', data.data.token)
    // 访问后台接口获取用户信息
    ModelLogin.getVipInfo({ token: data.data.token }).then(res => {
     App.globalData.userInfo = res.data.userInfo
     // 返回上一页
     this.goBack()
    })
   })
   .catch(err => {
    this.data.locked = false
    console.log(err)
   })
 }
})

这里的App.WxService等价于wx因为wx是回调的方式,这里使用的是promise。

先判断有没有授权,没有授权显示点击授权,有授权显示点击登录,调用的方法都是wechatSignUp,拿到wx.login的code和wx.getUserInfo的数据给后台,然后后台返回token,然后再去访问后台获取用户信息

login的逻辑大概就是这些

login.wxml

<view class="login-container">
 <view class="login" wx:if="{{ !logged }}">
  <view class="app-info">
   <image class="app-logo" src="./s-toplogo@2x.png" />
   <text class="app-name">商城</text>
  </view>
  <view class="alert">
   <view class="alert-title" wx:if="{{!isauth}}">请同意授权</view>
   <view class="alert-title" wx:if="{{isauth}}">请登录</view>
   <view class="alert-desc">
    <view class="alert-text">为了让头号买手可以更好的为您服务</view>
   </view>
  </view>
  <button type='primary' wx:if="{{!isauth}}" class="sui-f16" open-type="getUserInfo" bind:getuserinfo="wechatSignUp">确认授权</button>
  <button type="primary" wx:if="{{isauth}}" class="weui-btn" bindtap="login">确认登录</button>
 </view>
 <view class="logged" wx:else>
  <image class="logged-icon" src="./s-toplogo@2x.png" />
  <view class="logged-text">近期你已经授权登陆过商城</view>
  <view class="logged-text">自动登录中</view>
 </view>
</view>

访问后台接口的时候在header里传token如果后台没有拿到token就返回401,前端统一拦截跳转到登陆页面

结束

关于app.js本来打算在app做拦截的,但是异步请求总是在进入页面后才拿到后台返回的数据,因为用户可能从商品详情页等其他页面进入小程序,授权后要返回进入页面,在app.js中拦截就无法返回页面了,所以就直接在页面的js里去判断,还好可以分享的页面不多所以就没有在app.js里写任何东西。第一次接触,希望以后能优化了再发文记录一下

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
下载站控制介绍字数显示的脚本 显示全部 隐藏介绍等功能
Sep 19 Javascript
浅析offsetLeft,Left,clientLeft之间的区别
Nov 30 Javascript
jquery实现鼠标拖动图片效果示例代码
Jan 09 Javascript
JQuery弹出层示例可自定义
May 19 Javascript
javascript中关于&amp;&amp; 和 || 表达式的小技巧分享
Apr 10 Javascript
JavaScript+html5 canvas绘制的小人效果
Jan 27 Javascript
Bootstrap弹出带合法性检查的登录框实例代码【推荐】
Jun 23 Javascript
解析Javascript单例模式概念与实例
Dec 05 Javascript
Jquery给当前页或者跳转后页面的导航栏添加选中后样式的实例
Dec 08 Javascript
JavaScript上传文件时不用刷新页面方法总结(推荐)
Aug 15 Javascript
javascript深拷贝、浅拷贝和循环引用深入理解
May 27 Javascript
解决vue watch数据的方法被调用了两次的问题
Nov 07 Javascript
mpvue 单文件页面配置详解
Dec 02 #Javascript
Vuejs监听vuex中值的变化的方法示例
Dec 02 #Javascript
详解Vue一个案例引发「内容分发slot」的最全总结
Dec 02 #Javascript
在移动端使用vue-router和keep-alive的方法示例
Dec 02 #Javascript
Angular6 Filter实现页面搜索的示例代码
Dec 02 #Javascript
GOJS+VUE实现流程图效果
Dec 01 #Javascript
JavaScript实现简单轮播图效果
Dec 01 #Javascript
You might like
php实现的简单压缩英文字符串的代码
2008/04/24 PHP
php使用GD创建保持宽高比缩略图的方法
2015/04/17 PHP
PHP基于SMTP协议实现邮件发送实例代码
2017/04/27 PHP
Laravel获取所有的数据库表及结构的方法
2019/10/10 PHP
PHP7创建COOKIE和销毁COOKIE的实例方法
2020/02/03 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
js获取鼠标点击的位置实现思路及代码
2014/05/09 Javascript
JavaScript运动减速效果实例分析
2015/08/04 Javascript
jQuery实现类似标签风格的导航菜单效果代码
2015/08/25 Javascript
Javascript删除指定元素节点的方法
2016/06/21 Javascript
Vue.js快速入门实例教程
2016/10/15 Javascript
Bootstrap table使用方法汇总
2017/11/17 Javascript
vue webpack实用技巧总结
2018/04/24 Javascript
4个顶级JavaScript高级文本编辑器
2018/10/10 Javascript
element vue Array数组和Map对象的添加与删除操作
2018/11/14 Javascript
解决layui checkbox 提交多个值的问题
2019/09/02 Javascript
基于Vue+ElementUI的省市区地址选择通用组件
2019/11/20 Javascript
JavaScript实现省份城市的三级联动
2020/02/11 Javascript
jQuery+ajax实现用户登录验证
2020/09/13 jQuery
python中的编码知识整理汇总
2016/01/26 Python
Python 详解基本语法_函数_返回值
2017/01/22 Python
Python3中详解fabfile的编写
2018/06/24 Python
python matplotlib拟合直线的实现
2019/11/19 Python
使用Python实现正态分布、正态分布采样
2019/11/20 Python
浅谈Keras中shuffle和validation_split的顺序
2020/06/19 Python
Python使用pycharm导入pymysql教程
2020/09/16 Python
css3 transform过渡抖动问题解决
2020/10/23 HTML / CSS
CSS3 实现图形下落动画效果
2020/11/13 HTML / CSS
HTML5 FileReader对象的具体使用方法
2020/05/22 HTML / CSS
澳大利亚个性化儿童礼品网站:Bright Star Kids
2019/06/14 全球购物
竞职演讲稿范文
2014/01/11 职场文书
交通安全寄语大全
2014/04/08 职场文书
2014年旅游局法制宣传日活动总结
2014/11/01 职场文书
2015年保卫科工作总结
2015/05/14 职场文书
Python3 多线程(连接池)操作MySQL插入数据
2021/06/09 Python
Qt自定义Plot实现曲线绘制的详细过程
2021/11/02 Python