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
相关产品推荐
相关产品推荐

