如何通过微博API获取Refresh Token实现令牌自动刷新?
我之前对接微博OAuth时也踩过这个坑,刚好能给你理清楚原因和解决办法:
核心原因:微博OAuth的两种授权有效期模式
微博的OAuth 2.0实现和标准流程有点不一样,它分两种授权令牌:
- 短期授权令牌:有效期只有2小时,这种会返回
refresh_token,方便你后续刷新获取新的access_token - 长期授权令牌:有效期长达5年(你返回里的
expires_in=157679999秒,算下来刚好差不多5年),这种令牌本身有效期足够长,所以API不会返回refresh_token
你现在拿到的就是长期授权令牌,所以自然看不到refresh_token字段啦。
如何获取带Refresh Token的短期令牌?
如果你的业务场景确实需要频繁刷新令牌(比如不想用5年有效期的令牌),可以这么调整:
修改授权请求的参数
在调用getAuthorizeURL的时候,追加duration=short参数,明确请求短期授权:$code_url = $o->getAuthorizeURL(WEIBO_APP_CALLBACK_URL) . '&duration=short';这样用户授权后,你拿到的就是有效期2小时的令牌,同时会返回
refresh_token。检查应用后台设置
登录微博开放平台,进到你的应用详情页,找“高级信息”里的“OAuth2.0授权设置”,确认“授权有效期”是不是设成了“短期授权(默认2小时)”。如果后台设的是长期授权,就算你加了参数可能还是会返回长期令牌。
针对你的CRON任务的更优方案
其实看你的需求——CRON任务定期获取用户动态存数据库,长期授权令牌反而更适合你啊!5年有效期足够用很久了,你完全可以把这个令牌存到数据库里,定期计算过期时间(用strtotime('now') + $token['expires_in']就行),等快过期的时候再引导用户重新授权一次就好,根本不用折腾刷新令牌的事儿。
关于你用的libweibo SDK
这个SDK的getAccessToken方法是符合微博API规范的,拿到长期令牌时确实不会返回refresh_token,你不用改SDK代码,选对授权模式就行。
小验证:你可以算一下
157679999秒是多久——除以3600是约43800小时,再除以24是约1825天,刚好差不多5年,这就实锤是长期令牌了。
内容的提问来源于stack exchange,提问作者Paul Bonneau

