uni-app uni.login 使用苹果授权登录时,首次需主动授权,后续静默授权,但一段时间后静默授权的token过期
uni-app uni.login 使用苹果授权登录时,首次需主动授权,后续静默授权,但一段时间后静默授权的token过期
| 信息类别 | 详细信息 |
|---|---|
| 产品分类 | uniapp/App |
| PC开发环境 | Mac |
| PC版本号 | 12.3 |
| HBuilderX | 正式 |
| HBuilderX版本号 | 4.08 |
| 手机系统 | iOS |
| 手机系统版本号 | iOS 16 |
| 手机厂商 | 苹果 |
| 手机机型 | 15 pro |
| 页面类型 | vue |
| vue版本 | vue2 |
| 打包方式 | 云端 |
| 项目创建方式 | HBuilderX |
操作步骤:
- 授权登录之后,过两天退出登录后重新授权
预期结果:
- uni.login 使用苹果授权登录的时候,只有第一次是需要主动授权,后续是静默授权,静默授权的token是有效的
实际结果:
- uni.login 使用苹果授权登录的时候,只有第一次是需要主动授权,后续是静默授权,一段时间后静默授权的token是过期的
bug描述:
- uni.login 使用苹果授权登录的时候,只有第一次是需要主动授权,后续是静默授权,一段时间后静默授权的token是过期的
更多关于uni-app uni.login 使用苹果授权登录时,首次需主动授权,后续静默授权,但一段时间后静默授权的token过期的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于uni-app uni.login 使用苹果授权登录时,首次需主动授权,后续静默授权,但一段时间后静默授权的token过期的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在使用 uni-app 进行苹果授权登录时,苹果的登录机制确实存在首次授权和后续静默授权的流程。静默授权的 token 通常会有一个有效期,过期后需要重新获取新的 token。以下是处理这种情况的一些建议:
1. 检测 Token 是否过期
你可以在每次请求时检查 token 是否过期。苹果的 token 通常会包含一个 exp(Expiration Time)字段,表示 token 的过期时间。你可以通过比较当前时间和 exp 字段来判断 token 是否过期。
const isTokenExpired = (token) => {
const decodedToken = jwt_decode(token); // 使用 jwt-decode 库解码 token
const currentTime = Date.now() / 1000; // 获取当前时间(秒)
return decodedToken.exp < currentTime;
};
2. 重新获取 Token
如果检测到 token 过期,你可以通过调用 uni.login 重新获取 token。苹果的登录机制允许用户在已经授权的情况下进行静默登录。
uni.login({
provider: 'apple',
success: (res) => {
console.log('Apple login success:', res);
const newToken = res.authResult.access_token;
// 使用新的 token 进行后续操作
},
fail: (err) => {
console.error('Apple login failed:', err);
}
});
3. 处理用户未授权的情况
如果用户在首次授权后取消了授权,或者 token 过期后无法进行静默登录,你需要提示用户重新授权。
uni.login({
provider: 'apple',
success: (res) => {
console.log('Apple login success:', res);
const newToken = res.authResult.access_token;
// 使用新的 token 进行后续操作
},
fail: (err) => {
if (err.code === '10002') { // 假设 10002 是用户取消授权的错误码
// 提示用户重新授权
uni.showModal({
title: '提示',
content: '请重新授权登录',
success: (modalRes) => {
if (modalRes.confirm) {
// 用户确认重新授权
uni.login({
provider: 'apple',
success: (res) => {
console.log('Apple login success:', res);
const newToken = res.authResult.access_token;
// 使用新的 token 进行后续操作
},
fail: (err) => {
console.error('Apple login failed:', err);
}
});
}
}
});
} else {
console.error('Apple login failed:', err);
}
}
});
4. 定期刷新 Token
为了避免 token 过期导致的问题,你可以定期刷新 token。例如,你可以在每次 token 过期前主动刷新 token。
const refreshToken = () => {
uni.login({
provider: 'apple',
success: (res) => {
console.log('Apple login success:', res);
const newToken = res.authResult.access_token;
// 使用新的 token 进行后续操作
},
fail: (err) => {
console.error('Apple login failed:', err);
}
});
};
// 定期刷新 token,例如每 30 分钟一次
setInterval(refreshToken, 30 * 60 * 1000);
5. 使用 refresh_token
苹果的 OAuth 2.0 流程中通常会返回一个 refresh_token,你可以使用这个 refresh_token 来获取新的 access_token,而不需要用户重新授权。
const refreshAccessToken = (refreshToken) => {
// 调用苹果的 token 刷新接口
uni.request({
url: 'https://appleid.apple.com/auth/token',
method: 'POST',
data: {
grant_type: 'refresh_token',
refresh_token: refreshToken,
client_id: 'your_client_id',
client_secret: 'your_client_secret'
},
success: (res) => {
const newAccessToken = res.data.access_token;
// 使用新的 access_token 进行后续操作
},
fail: (err) => {
console.error('Refresh token failed:', err);
}
});
};

