内容正在载入中,请稍后……
公告
About me
搜索
统计
其他
21 Aug.2020

vue微信网页授权解决方案 晴

作者: 我就是个世界   分类:技术&学习 » 网页设计   出处:segmentfault            | |
首先我们看下微信授权的流程图,关于微信网页授权

前端需要做的是

第一步:用户同意授权,获取code,拼接微信授权地址,redirect_uri就是你的当前地址,关于appid有些人是通过接口获取的,我这里就直接写在项目全局变量里了VUE_APP_WECHAT_APPID,用户授权成功后微信会携带code和status跳回来

https://open.weixin.qq.com/connect/oauth2/authorize?appid=${this.appid}&redirect_uri=${this.redirect_uri}&response_type=code&scope=${this.scope}&state=${this.state}#wechat_redirect


第二步,访问登录接口,将code传给服务端,小哥哥进行一系列的操作,通过code换取网页授权access_token拉取用户信息(需scope为 snsapi_userinfo),返回是否登录成功,成功后返回用户信息和登录令牌 token

Highslide JS



在permission.js中路由拦截进行这一系列操作,代码注释很详细了

permission.js

import router from './router'
import store from './store'
import getPageTitle from '@/utils/get-page-title'
import wechatAuth from './plugins/wechatAuth' // 微信登录插件
const qs = require('qs')

router.beforeEach((to, from, next) => {
  const loginStatus = Number(store.getters.loginStatus)
  console.log('loginStatus=' + loginStatus)
  console.log('token=' + store.getters.token)
  // 页面标题
  document.title = getPageTitle(to.meta.title)
  if (loginStatus === 0) {
    // 微信未授权登录跳转到授权登录页面
    const url = window.location.href
    // 解决重复登录url添加重复的code与state问题
    const parseUrl = qs.parse(url.split('?')[1])
    let loginUrl
    if (parseUrl.code && parseUrl.state) {
      delete parseUrl.code
      delete parseUrl.state
      loginUrl = `${url.split('?')[0]}?${qs.stringify(parseUrl)}`
    } else {
      loginUrl = url
    }
    // 设置微信授权回调地址
    wechatAuth.redirect_uri = loginUrl
    // 无论拒绝还是授权都设置成1
    store.dispatch('user/setLoginStatus', 1)
    // 跳转到微信授权页面
    window.location.href = wechatAuth.authUrl
  } else if (loginStatus === 1) {
    // 用户已授权,获取code
    try {
      // 通过回调链接设置code status
      wechatAuth.returnFromWechat(to.fullPath)
    } catch (err) {
      // 失败,设置状态未登录,刷新页面
      store.dispatch('user/setLoginStatus', 0)
      location.reload()
    }
    // 同意授权 to.fullPath 携带code参数,拒绝授权没有code参数
    const code = wechatAuth.code
    if (code) {
      // 拿到code 访问服务端的登录接口
      store
        .dispatch('user/loginWechatAuth', code)
        .then(res => {
          // 成功设置已登录状态
          store.dispatch('user/setLoginStatus', 2)
          next()
        })
        .catch(() => {
          // 失败,设置状态未登录,刷新页面
          store.dispatch('user/setLoginStatus', 0)
          location.reload()
        })
    } else {
      store.dispatch('user/setLoginStatus', 0)
      location.reload()
    }
  } else {
   // 已登录直接进入
    next()
  }
})



登录成功后存用户信息,token。访问所有的接口的时候都会在header携带token,如果token失效了,服务端会返回401,做退出操作,删除登录状态,用户信息,token,刷新页面重新进入。

request.js

  // 登录超时,重新登录    
if (res.status === 401) {    
    store.dispatch('user/fedLogOut').then(() => {  
        location.reload()    
    })      
}


用户登录后将token和用户信息存入storage中,登录状态设置到cookie里,store user中主要是进行用户信息存贮获取删除的操作

store/modules/user.js


import { loginByCode } from '@/api/user'
import {
  saveToken,
  saveLoginStatus,
  saveUserInfo,
  removeToken,
  removeUserInfo,
  removeLoginStatus,
  loadLoginStatus,
  loadToken,
  loadUserInfo
} from '@/utils/cache'
const state = {
  loginStatus: loadLoginStatus(), // 登录状态
  token: loadToken(), // token
  userInfo: loadUserInfo() // 用户登录信息
}

const mutations = {
  SET_USERINFO: (state, userInfo) => {
    state.userInfo = userInfo
  },
  SET_LOGIN_STATUS: (state, loginStatus) => {
    state.loginStatus = loginStatus
  },
  SET_TOKEN: (state, token) => {
    state.token = token
  }
}

const actions = {
  // 登录相关,通过code获取token和用户信息
  loginWechatAuth({ commit }, code) {
    const data = {
      code: code
    }
    return new Promise((resolve, reject) => {
      loginByCode(data)
        .then(res => {
          // 存用户信息,token
          commit('SET_USERINFO', saveUserInfo(res.data.user))
          commit('SET_TOKEN', saveToken(res.data.token))
          resolve(res)
        })
        .catch(error => {
          reject(error)
        })
    })
  },
  // 设置状态
  setLoginStatus({ commit }, query) {
    if (query === 0 || query === 1) {
      // 上线打开注释,本地调试注释掉,保持信息最新
      removeToken()
      removeUserInfo()
    }
    // 设置不同的登录状态
    commit('SET_LOGIN_STATUS', saveLoginStatus(query))
  },
  // 登出
  fedLogOut() {
    // 删除token,用户信息,登陆状态
    removeToken()
    removeUserInfo()
    removeLoginStatus()
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}


在根目录下.env开头的三个文件中设置微信appID
VUE_APP_WECHAT_APPID='12345678'



来源:https://segmentfault.com/a/1190000019488056
分享到QQ空间
最后编辑: 我就是个世界 编辑于August 22, 2020 21:25
时间:17:13 评论(0) 引用(0) 阅读(72) Tags: , , ,
发表评论
  昵称 [注册]
  密码 (游客无需密码)
  网址
  电邮
OpenID登入 权限选项 表情