You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Yii2集成Fitbit Auth2 API后Token过期,如何实现单次授权无需重连

Fitbit API 免重复授权永久使用方案

Fitbit 官方不提供永久有效的访问令牌(Access Token),你可以通过**自动刷新刷新令牌(Refresh Token)**的方式实现用户仅授权一次即可长期使用,无需重复登录确认,具体实现步骤如下:

核心实现逻辑

OAuth2 授权流程中,用户首次授权成功后,你会同时拿到三个核心参数:

  • 有效期约8小时的 access_token:用于调用Fitbit各类业务接口
  • 有效期1年的 refresh_token:用于换新的access_token,无需用户参与
  • expires_in:access_token的有效时长,单位为秒
    你只需要提前把这三个参数和对应用户ID绑定存储到数据库,在每次调用Fitbit接口前自动校验token有效性,过期就自动刷新,全程用户无感知。

具体适配步骤(适配你现有的Yii2代码)

  • 第一步:补充首次授权换令牌的存储逻辑
    你现在的代码只写了跳转到授权页的逻辑,需要补充授权回调地址的逻辑:用户授权后会带回code参数,你需要拿着code调用ACCESS_TOKEN_URL接口拿到首次的access_token、refresh_token、expires_in,计算出access_token的过期时间戳(当前时间+expires_in),一起存入用户关联表。
  • 第二步:新增令牌自动刷新方法
    在你的FitbitApiController中新增刷新令牌的公共方法,示例代码如下:
/**
 * 自动刷新access token,刷新成功返回新的token,失败返回false
 * @param string $oldRefreshToken 数据库存的旧refresh_token
 * @return bool|array
 */
public function refreshAccessToken($oldRefreshToken)
{
    $postData = [
        'grant_type' => 'refresh_token',
        'refresh_token' => $oldRefreshToken,
        'client_id' => $this->CLIENT_ID,
        'redirect_uri' => $this->REDIRECT_URI,
    ];
    // 构造Basic认证头:client_id:client_secret 做base64编码
    $authHeader = 'Basic ' . base64_encode($this->CLIENT_ID . ':' . $this->CLIENT_SECRET);
    
    $ch = curl_init(ACCESS_TOKEN_URL);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Authorization: ' . $authHeader,
        'Content-Type: application/x-www-form-urlencoded'
    ]);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    curl_close($ch);
    
    $result = json_decode($response, true);
    if (isset($result['access_token'])) {
        // 刷新成功,更新数据库里的access_token、refresh_token、过期时间
        $newTokenData = [
            'access_token' => $result['access_token'],
            'refresh_token' => $result['refresh_token'],
            'expires_at' => time() + $result['expires_in']
        ];
        // 这里写你自己的更新数据库逻辑,把新的token和对应用户绑定更新
        // UserFitbitToken::updateAll($newTokenData, ['user_id' => 当前登录用户ID]);
        $this->accessToken = $result['access_token'];
        $this->refreshToken = $result['refresh_token'];
        return $newTokenData;
    }
    return false;
}
  • 第三步:调用接口前增加token校验逻辑
    每次需要调用Fitbit业务接口前,先判断数据库中存的expires_at是不是小于当前时间+3600秒(留1小时缓冲避免刚好过期调用失败),如果已经到期就调用上面的refreshAccessToken方法换新的token再调用业务接口即可。

注意事项

  • 每次刷新token后Fitbit会返回新的access_token和新的refresh_token,一定要把新的两个值都更新到数据库,旧的refresh_token使用一次就会失效,不能重复使用。
  • 只要你在refresh_token1年有效期内至少刷新一次,就能一直续期,完全不需要用户再次授权,达到永久使用的效果。
  • 如果刷新接口返回invalid_grant错误,说明refresh_token已经过期,此时才需要引导用户重新走一次授权流程。

内容的提问来源于stack exchange,提问作者Rajeev Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 14:54:04