項目採用Vue做爲開發框架,用戶瀏覽頁面時有兩種狀況:前端
在無需用戶登陸的頁面中,可能包含須要用戶信息的操做,此時就須要用戶登陸以後方能進行後續操做。所以,須要對受權登陸策略進行區分。後端
通常而言,咱們爲微信開發的H5頁面,進入頁面的時候就進行鑑權,要求用戶登陸以後才能繼續瀏覽。但因爲產品需求,這個項目咱們須要對不一樣頁面的鑑權策略進行劃分,按照通常與特殊進行設計:promise
// routerRule.js
export default function routerRule (router, whiteList = []) {
// other codes...
router.beforeEach( (to, from, next ) => {
// 由於受權登陸涉及異步操做,所以使用promise,成功的回調中調用next函數
new Promise((resolve, rejects) => {
if ( whiteListRouter.indexOf(to.path) !== -1 ) {
resolve()
return
}
// 常規頁面受權登陸過程
if (hasToken()) {
// codes,獲取用戶信息而且跳轉所需跳轉的頁面
} else {
// 判斷用戶是否已經進行微信受權
if (hasAuthed()) {
// 進行過微信受權以後,重定向回來的url中包含了微信的受權信息,能夠將url上截取的參數發送到服務器,換取用戶的token,隨後進入上述有token時候的步驟
getWechatUserInfo().then(res => {
resolve()
})
} else {
// 用戶還沒有進行微信受權,則調用微信受權的方法,進行受權登陸。
getWechatAuth()
}
}
}).then( res => {
next()
})
})
router.afterEach(( to, from ) => {
wxShare({ title: to.meta.title, desc: to.meta.shareDesc, link: to.meta.shareLink, logo: to.meta.shareLogo})
})
}
複製代碼
本項目是在用戶初次進行微信綁定時,就將用戶的微信信息與本站的用戶信息進行的綁定,所以在獲取用戶微信受權信息後,就能夠獲取到用戶的token,從而獲取用戶在本站的其餘用戶信息。服務器
根據上面的邏輯,進入白名單以後,整個函數已經被return掉,不會進入下面的鑑權過程。可是若是是在此種頁面上進行須要權限的操做,那麼就須要觸發受權登陸流程,而且在受權以後,要一併獲取用戶信息。微信
// checkLogin.js
export function checkLogin({ redirectUrl, wxAuthLoading, wxAuthLoaded, callback } = {}) {
if (getToken()) {
// ...
callback && callback()
} else {
// 提示用戶正在受權中
wxAuthLoading && wxAuthLoading()
getWechatAuth( redirectUrl || window.location.href ).then( res => {
// 受權完畢,提示用戶受權成功
wxAuthLoaded && wxAuthLoaded()
})
}
}
複製代碼
同時,咱們須要對路由白名單添加一些操做微信開發
// routerRule.js
export default function routerRule (router, whiteList = []) {
// other codes...
router.beforeEach( (to, from, next ) => {
// 由於受權登陸涉及異步操做,所以使用promise,成功的回調中調用next函數
new Promise((resolve, rejects) => {
if ( whiteListRouter.indexOf(to.path) !== -1 ) {
// 若是已經進行微信受權可是沒有token值的,就調用如下函數獲取token值
if ( !hasToken() && hasAuthed() ) {
getWechatUserInfo().then(res => {
resolve()
})
}
resolve()
return
}
// 常規頁面受權登陸過程
if (hasToken()) {
// codes,獲取用戶信息而且跳轉所需跳轉的頁面
} else {
// 判斷用戶是否已經進行微信受權
if (hasAuthed()) {
// 進行過微信受權以後,重定向回來的url中包含了微信的受權信息,能夠將url上截取的參數發送到服務器,換取用戶的token,隨後進入上述有token時候的步驟
getWechatUserInfo().then(res => {
resolve()
})
} else {
// 用戶還沒有進行微信受權,則調用微信受權的方法,進行受權登陸。
getWechatAuth()
}
}
}).then( res => {
next()
})
})
// other codes...
}
複製代碼
這是本人開發過程當中想到的不成熟的方案,若是有更好的方法,請不吝告知,謝謝!框架