diff --git a/src/App.vue b/src/App.vue index 25412ba..6df4f46 100644 --- a/src/App.vue +++ b/src/App.vue @@ -7,14 +7,9 @@ import { getAccessToken } from "@/constant/token"; onLaunch(async () => { /// 获取环境配置 await getEvnUrl(); - - /// 获取token - const token = getAccessToken(); - - if (token) { - /// 刷新token - refreshToken(); - } + + /// 刷新token + await refreshToken(); }); onShow(() => { diff --git a/src/hooks/useGoLogin.js b/src/hooks/useGoLogin.js index d546a29..67fc81b 100644 --- a/src/hooks/useGoLogin.js +++ b/src/hooks/useGoLogin.js @@ -1,5 +1,5 @@ import { oauthToken, checkUserPhone } from "@/request/api/LoginApi"; -import { loginAuth, bindPhone } from "@/manager/LoginManager"; +import { authLogin, refreshAuthLogin, checkRefreshToken } from "@/manager/LoginManager"; import { clientId } from "@/constant/base"; import { getAccessToken, removeAccessToken, setAccessToken } from "../constant/token"; import { NOTICE_EVENT_LOGIN_SUCCESS } from "@/constant/constant"; @@ -10,6 +10,18 @@ export const goLogin = () => uni.navigateTo({ url: "/pages/login/index" }); // 登录成功后,返回上一页 export const goBack = () => uni.navigateBack({ delta: 1 }); +// 检测token +export const checkToken = () => { + const token = getAccessToken(); + return new Promise((resolve) => { + if (!token) { + goLogin(); + return; + } + resolve(); + }); +}; + // 登录逻辑 export const onLogin = async (e) => { console.info("onLogin code: ", e); @@ -21,8 +33,8 @@ export const onLogin = async (e) => { return; } - await loginAuth(e).then(async () => { - console.log("loginAuth resolve success"); + await authLogin(e).then(async () => { + console.log("authLogin resolve success"); // 检查手机号是否绑定 const checkRes = await checkUserPhone(); if (checkRes.data) { @@ -39,7 +51,7 @@ export const onLogin = async (e) => { // 绑定手机号 const params = { wechatPhoneCode: code, clientId: clientId }; - const res = await bindPhone(params); + const res = await bindUserPhone(params); if (res.data) { // 登录成功后,触发登录成功事件 uni.$emit(NOTICE_EVENT_LOGIN_SUCCESS); @@ -53,83 +65,44 @@ export const onLogin = async (e) => { }); }; -// 检测token -export const checkToken = () => { - const token = getAccessToken(); - - return new Promise((resolve) => { - if (!token) { - goLogin(); - return; - } - - resolve(); - }); -}; - -// 刷新token -export const refreshToken = () => { - let provider = "weixin"; - let grant_type = "wechat"; - - // #ifdef APP-PLUS - const systemInfo = uni.getSystemInfoSync(); - if (systemInfo.platform === "ios") { - provider = "apple"; - grant_type = "apple"; - } - // #endif - +/// 检查手机号登录 +export const onCheckPhoneLogin = async () => { return new Promise(async (resolve) => { - uni.login({ - provider, - success: async (loginRes) => { - console.log("refreshToken success: ", JSON.stringify(loginRes)); - const openIdCode = - provider === "apple" - ? loginRes.appleInfo && loginRes.appleInfo.identityToken - : loginRes.code; - console.log("获取到的授权code:", openIdCode); + await refreshAuthLogin().then(async () => { + // 刷新成功后,检查手机号是否绑定 + const access_token = getAccessToken(); + const checkRes = await checkUserPhone({ + token: access_token, + }); - if (!openIdCode) { - console.warn("refreshToken 未获取到登录 code"); - resolve(true); - return; - } - - const params = { - grant_type: grant_type, - clientId: clientId, - scope: "server", - }; - - if (provider === "apple") { - params.identityToken = openIdCode; - } else { - params.openIdCode = [openIdCode]; - } - console.log("获取到的授权params:", JSON.stringify(params)); - - const response = await oauthToken(params); - if (response.access_token) { - setAccessToken(response.access_token); - - const checkRes = await checkUserPhone({ - token: response.access_token, - }); - if (checkRes.data) { - // 登录成功后,触发登录成功事件 - uni.$emit(NOTICE_EVENT_LOGIN_SUCCESS); - resolve(false); - } else { - resolve(true); - } - } - }, - fail: (err) => { - console.warn("refreshToken uni.login fail:", err); + if (checkRes.data) { + // 登录成功后,触发登录成功事件 + uni.$emit(NOTICE_EVENT_LOGIN_SUCCESS); + resolve(false); + } else { resolve(true); - }, + } }); }); }; + +/// apple登录 +export const onAppleLogin = async (e) => { + return new Promise(async (resolve) => { + await refreshAuthLogin() + .then(() => { + // 登录成功后,触发登录成功事件 + uni.$emit(NOTICE_EVENT_LOGIN_SUCCESS); + resolve(true); + }) + .catch(() => { + resolve(false); + }); + }); +} + + +/// 刷新 token +export const refreshToken = async () => { + await checkRefreshToken() +}; diff --git a/src/manager/LoginManager.js b/src/manager/LoginManager.js index 73aaae9..44854b6 100644 --- a/src/manager/LoginManager.js +++ b/src/manager/LoginManager.js @@ -1,12 +1,12 @@ import { oauthToken, bindUserPhone } from "../request/api/LoginApi"; import { clientId } from "@/constant/base"; import { NOTICE_EVENT_LOGIN_SUCCESS } from "@/constant/constant"; -import { removeAccessToken, setAccessToken } from "../constant/token"; +import { removeAccessToken, setAccessToken, getRefreshToken, setRefreshToken, getAccessToken } from "../constant/token"; -const loginAuth = (e) => { +const authLogin = (e) => { removeAccessToken(); - // 条件编译微信小程序、抖音小程序、APP-PLUS(包含iOS和Android) + // 条件编译微信小程序、抖音小程序 let provider = "weixin"; let grant_type = "wechat"; @@ -20,6 +20,58 @@ const loginAuth = (e) => { grant_type = "toutiao"; // #endif + return new Promise(async (resolve, reject) => { + uni.login({ + provider, + onlyAuthorize: true, + success: async (loginRes) => { + console.log("Authorize success: ", JSON.stringify(loginRes)); + const openIdCode = loginRes.code; + console.log("authLogin获取到的授权code:", openIdCode); + + if (!openIdCode) { + console.warn("authLogin未获取到授权 code"); + reject("authLogin未获取到授权code"); + return; + } + + const params = { + openIdCode: [openIdCode], + grant_type: grant_type, + clientId: clientId, + scope: "server", + }; + console.log("authLogin获取到的授权params:", JSON.stringify(params)); + + await loginRequest(params) + .then(() => { + resolve(false); + }) + .catch((err) => { + reject(err); + }); + }, + fail: (err) => { + reject("authLogin登录失败"); + }, + }); + }); +}; + +const refreshAuthLogin = () => { + let provider = "weixin"; + let grant_type = "wechat"; + + // #ifdef MP-WEIXIN + provider = "weixin"; + grant_type = "wechat"; + // #endif + + // #ifdef MP-TOUTIAO + provider = "toutiao"; + grant_type = "toutiao"; + // #endif + // #ifdef APP-PLUS const systemInfo = uni.getSystemInfoSync(); if (systemInfo.platform === "ios") { @@ -27,22 +79,21 @@ const loginAuth = (e) => { grant_type = "apple"; } // #endif - + return new Promise(async (resolve, reject) => { uni.login({ provider, - onlyAuthorize: true, success: async (loginRes) => { console.log("Authorize success: ", JSON.stringify(loginRes)); const openIdCode = provider === "apple" ? loginRes.appleInfo && loginRes.appleInfo.identityToken : loginRes.code; - console.log("获取到的授权code:", openIdCode); + console.log("refreshAuthLogin获取到的授权code:", openIdCode); if (!openIdCode) { - console.warn("refreshToken 未获取到登录 code"); - reject("refreshToken 未获取到登录 code"); + console.warn("refreshAuthLogin未获取到授权code"); + reject("refreshAuthLogin未获取到授权code"); return; } @@ -51,37 +102,67 @@ const loginAuth = (e) => { clientId: clientId, scope: "server", }; - + if (provider === "apple") { params.identityToken = openIdCode; } else { params.openIdCode = [openIdCode]; } - console.log("获取到的授权params:", JSON.stringify(params)); - - const response = await oauthToken(params); - if (response.access_token) { - setAccessToken(response.access_token); - resolve(); - } else { - reject(response.message || "登录失败"); - } + console.log("refreshAuthLogin获取到的授权params:", JSON.stringify(params)); + await loginRequest(params) + .then(() => { + resolve(); + }) + .catch((err) => { + reject(err); + }); }, fail: (err) => { - reject("登录失败"); + console.warn("refreshAuthLogin fail:", err); + reject("refreshAuthLogin登录失败"); }, }); }); }; -const bindPhone = async (params) => { - try { - const response = await bindUserPhone(params); - return response; - } catch (error) { - throw error; +/// 检查刷新 token 是否有效 +const checkRefreshToken = async () => { + const token = getRefreshToken(); + if (token) { + await refreshTokenRequest(token); } -}; +} -export { loginAuth, bindPhone }; +/// 刷新 token 的函数 +const refreshTokenRequest = async (token) => { + const params = { + grant_type: 'refresh_token', + refresh_token: token, + clientId: clientId, + scope: "server", + }; + + const response = await oauthToken(params); + if (response.refresh_token && response.access_token) { + setRefreshToken(response.refresh_token); + setAccessToken(response.access_token); + return true; + } else { + return false; + } +} + +/// 重新登录的函数 +const loginRequest = async (params) => { + const response = await oauthToken(params); + if (response.access_token) { + setAccessToken(response.access_token); + setRefreshToken(response.refresh_token); + return true; + } else { + throw new Error(response.message || "登录失败"); + } +} + +export { authLogin, refreshAuthLogin, checkRefreshToken }; diff --git a/src/pages/ChatMain/NoticeMessage/index.vue b/src/pages/ChatMain/NoticeMessage/index.vue index aa2f2ae..5b407df 100644 --- a/src/pages/ChatMain/NoticeMessage/index.vue +++ b/src/pages/ChatMain/NoticeMessage/index.vue @@ -31,6 +31,7 @@