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

1 回复

更多关于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);
    }
  });
};
回到顶部