hookehuyr

feat(auth): 实现静默授权并优化授权流程

重构授权处理逻辑,新增静默授权功能避免页面跳转
优化401错误处理,使用静默授权替代页面跳转
移除未加入家庭时的强制跳转逻辑
重构returnToOriginalPage函数,优化页面跳转逻辑
......@@ -336,10 +336,6 @@ useDidShow(async () => {
if (rankingCardRef.value) {
rankingCardRef.value.refreshData();
}
} else {
// 如果没有加入家庭(code为0),跳转到欢迎页面
Taro.redirectTo({ url: '/pages/Welcome/index' });
return; // 直接返回,不执行后续逻辑
}
// TODO: 获取广告信息
......
<!--
* @Date: 2022-09-19 14:11:06
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2025-09-07 01:37:03
* @LastEditTime: 2025-09-12 10:20:03
* @FilePath: /lls_program/src/pages/auth/index.vue
* @Description: 文件描述
-->
......@@ -22,72 +22,13 @@ import request from '@/utils/request';
<script>
import "./index.less";
import { getCurrentPageParam } from "@/utils/weapp";
import { returnToOriginalPage } from "@/utils/authRedirect";
import { returnToOriginalPage, silentAuth } from '@/utils/authRedirect'
export default {
name: "authPage",
mounted () {
// 授权登陆
Taro.login({
success: function (res) {
if (res.code) {
//发起网络请求
Taro.showLoading({
title: '授权中',
})
// 根据环境判断是否传递openid参数
const requestData = {
code: res.code,
};
// 测试环境下传递openid,正式环境不传递
if (process.env.NODE_ENV === 'development') {
requestData.openid = 'h-008';
// requestData.openid = 'h-009';
// requestData.openid = 'h-010';
// requestData.openid = 'h-011';
// requestData.openid = 'h-012';
// requestData.openid = 'h-013';
// requestData.openid = 'oWbdFvkD5VtloC50wSNR9IWiU2q8';
// requestData.openid = 'oex8h5QZnZJto3ttvO6swSvylAQo';
}
request.post('/srv/?a=openid', requestData)
.then(res => {
if (res.data.code) {
var cookie = res.cookies[0];
if (cookie != null) {
wx.setStorageSync("sessionid", res.cookies[0]);//服务器返回的 Set-Cookie,保存到本地
//TAG 小程序绑定cookie
// 修改请求头
request.defaults.headers.cookie = res.cookies[0];
// if (res.data.data.avatar) {
// Taro.reLaunch({
// url: '../../' + getCurrentPageParam().url
// })
// } else { // 头像没有设置跳转完善信息页面
// Taro.redirectTo({
// url: '../apxUserInfo/index'
// })
// }
// TAG:处理分享跳转问题 - 使用新的重定向逻辑
returnToOriginalPage();
Taro.hideLoading();
}
} else {
console.warn(res.data.msg);
Taro.hideLoading();
}
})
.catch(err => {
console.error(err);
Taro.hideLoading();
});
} else {
console.log('登录失败!' + res.errMsg)
}
}
})
mounted() {
// 页面加载时优先尝试静默授权
this.performAuth();
},
data () {
return {
......@@ -110,6 +51,77 @@ export default {
// })
},
methods: {
performAuth() {
// 优先尝试静默授权
silentAuth().then(() => {
// 静默授权成功,检查当前页面是否需要跳转
const pages = Taro.getCurrentPages();
const currentPage = pages[pages.length - 1];
const currentRoute = currentPage?.route;
// 只有在auth页面时才需要跳转回原页面
if (currentRoute === 'pages/auth/index') {
returnToOriginalPage();
}
}).catch(() => {
// 静默授权失败,执行手动授权
this.manualAuth();
});
},
manualAuth() {
// 手动授权登陆
Taro.login({
success: function (res) {
if (res.code) {
//发起网络请求
Taro.showLoading({
title: '授权中',
})
// 根据环境判断是否传递openid参数
const requestData = {
code: res.code,
};
// 测试环境下传递openid,正式环境不传递
if (process.env.NODE_ENV === 'development') {
// requestData.openid = 'h-008';
// requestData.openid = 'h-009';
// requestData.openid = 'h-010';
// requestData.openid = 'h-011';
// requestData.openid = 'h-012';
// requestData.openid = 'h-013';
// requestData.openid = 'oWbdFvkD5VtloC50wSNR9IWiU2q8';
requestData.openid = 'oex8h5QZnZJto3ttvO6swSvylAQo';
}
request.post('/srv/?a=openid', requestData)
.then(res => {
if (res.data.code) {
var cookie = res.cookies[0];
if (cookie != null) {
wx.setStorageSync("sessionid", res.cookies[0]);//服务器返回的 Set-Cookie,保存到本地
//TAG 小程序绑定cookie
// 修改请求头
request.defaults.headers.cookie = res.cookies[0];
// TAG:处理分享跳转问题 - 使用新的重定向逻辑
returnToOriginalPage();
Taro.hideLoading();
}
} else {
console.warn(res.data.msg);
Taro.hideLoading();
}
})
.catch(err => {
console.error(err);
Taro.hideLoading();
});
} else {
console.log('登录失败!' + res.errMsg)
}
}
})
},
bindGetUserInfo (e) {
console.warn(e.detail.userInfo)
},
......
This diff is collapsed. Click to expand it.
/*
* @Date: 2022-09-19 14:11:06
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2025-09-04 15:33:42
* @LastEditTime: 2025-09-12 10:44:34
* @FilePath: /lls_program/src/utils/request.js
* @Description: 简单axios封装,后续按实际处理
*/
// import axios from 'axios'
import axios from 'axios-miniprogram';
// // import qs from 'Qs'
import { navigateToAuth } from '@/utils/authRedirect'
import { silentAuth } from '@/utils/authRedirect'
// import { ProgressStart, ProgressEnd } from '@/components/axios-progress/progress';
// import store from '@/store'
......@@ -147,18 +147,28 @@ service.interceptors.response.use(
/**
* 处理401未授权状态
* 清除本地sessionid并跳转到登录页
* 清除本地sessionid并使用静默授权
*/
if (response.data.code === 401) {
// 清除无效的sessionid
clearSessionId();
/**
* 未授权跳转登录页
* 授权完成后 返回当前页面
*/
setTimeout(() => {
navigateToAuth();
}, 1000);
// 使用静默授权处理,避免页面跳转
return silentAuth(
() => {
// 授权成功后重新发起原始请求
const originalRequest = response.config;
return service.request(originalRequest);
},
(error) => {
// 静默授权失败,直接返回错误,不跳转页面
console.error('静默授权失败:', error);
return Promise.reject(new Error('授权失败,请稍后重试'));
}
).catch(() => {
// 如果静默授权完全失败,直接返回错误,不跳转页面
return Promise.reject(new Error('授权失败,请稍后重试'));
});
}
return response
},
......