如何使用Spotify Android Auth API获取及刷新访问令牌?
Spotify Android 集成:令牌获取与刷新全解析
1. 用户登录后怎么拿到可用的访问令牌?
你踩的第一个坑是混淆了两种授权流的用途:
- Client Credentials 流:用
grant_type=client_credentials拿到的令牌是给服务端用的,没有绑定用户身份,只能调用公开接口(比如搜歌),碰/me开头的用户私有接口肯定会返回401/403,这是设计逻辑导致的。 - Authorization Code PKCE 流(移动端专用):
AuthorizationClient.openLoginActivity用的就是这个流,它会获取带用户权限的令牌,才能访问/me/tracks这类用户私有接口。- 不用每次弹登录:只要用户之前授权过你的应用,再次调用这个方法时,SDK会静默校验现有令牌是否有效——没过期直接返回,过期了会自动刷新(下文说明),不会弹出授权弹窗。
- 拿令牌的正确姿势:在登录回调里(不管是旧的
onActivityResult还是新的Activity Result API),从AuthorizationResponse里取accessToken,这个才是能调用用户接口的有效令牌。
2. 令牌过期后怎么自动刷新?
Spotify Android SDK已经把刷新逻辑完全封装好了,不需要你手动调用/api/token接口:
- 刷新令牌的获取:首次登录成功后,
AuthorizationResponse里是包含refreshToken的,用authorizationResponse.getRefreshToken()就能拿到,SDK会自动把它存在应用的SharedPreferences里,不用你手动存储。 - 自动刷新完全透明:当你用
SpotifyApi调用任何接口时,如果当前accessToken过期了,SDK会自动用保存的refreshToken去换取新的accessToken,整个过程对开发者完全透明,你正常调用接口即可。 - 手动刷新(可选):如果需要主动校验并刷新令牌,可以调用
SpotifyApi.refreshAccessToken()方法,它会返回新的有效令牌,也能提前处理令牌过期问题。
额外提醒
- 登录时一定要加对scope:比如读取私人播放列表需要
playlist-read-private,读取收藏曲目需要user-library-read,缺少对应权限的话,接口照样会返回403。 - 新版Android建议用Activity Result API替代
onActivityResult,通过registerForActivityResult(AuthorizationClient.createLoginContract(), callback)处理登录结果,更符合Jetpack规范。
内容的提问来源于stack exchange,提问作者Alex Mortimer
相关产品推荐
相关产品推荐

