如何在Github Actions等无界面环境下实现R包的Spotify API授权
无界面环境访问Spotify用户级资源的授权方案
你需要调用的me类用户专属接口确实无法通过客户端凭证流(client credentials flow)实现授权,可采用提前获取刷新令牌+无界面刷新访问令牌的方案实现,完全不需要在无界面环境触发浏览器交互:
步骤1:本地预获取长期刷新令牌
首先在你本地的交互式R环境中运行现有授权代码,完成一次浏览器授权,此时返回的令牌对象中已经包含长期有效的刷新令牌,可直接提取:
# 本地仅需运行一次,完成浏览器授权后获取刷新令牌 token <- get_spotify_authorization_code() # 提取刷新令牌 refresh_token <- token$credentials$refresh_token
将三个敏感参数SPOTIFY_CLIENT_ID、SPOTIFY_CLIENT_SECRET、SPOTIFY_REFRESH_TOKEN全部配置到Github Actions的加密Secrets中,禁止硬编码在代码仓库里。
步骤2:封装无界面环境专用的授权函数
无需走完整的网页授权流,直接通过刷新令牌向Spotify接口换取可用的访问令牌即可,封装示例如下:
get_spotify_token_headless <- function( client_id = Sys.getenv("SPOTIFY_CLIENT_ID"), client_secret = Sys.getenv("SPOTIFY_CLIENT_SECRET"), refresh_token = Sys.getenv("SPOTIFY_REFRESH_TOKEN") ) { res <- httr::POST( url = "https://accounts.spotify.com/api/token", httr::authenticate(client_id, client_secret), body = list( grant_type = "refresh_token", refresh_token = refresh_token ), encode = "form" ) httr::stop_for_status(res, "获取Spotify访问令牌") credentials <- httr::content(res) # 兼容Spotify返回新刷新令牌的场景 if (is.null(credentials$refresh_token)) { credentials$refresh_token <- refresh_token } return(credentials) }
调用说明:
- 该函数无任何交互要求,只要三个环境变量配置正确,即可在Github Actions等任意无界面环境运行
- 返回结果中的
credentials$access_token就是调用用户专属接口需要的授权凭证,请求接口时携带Authorization: Bearer {access_token}请求头即可 - Spotify的刷新令牌默认长期有效,仅在用户手动取消授权、或调整授权范围时才会失效,失效后仅需本地重新走一次交互授权,更新Secrets里的刷新令牌即可
内容的提问来源于stack exchange,提问作者Conor Neilson
相关产品推荐
相关产品推荐

