Strava API v3 获取所有运动员活动中的访问令牌问题

Posted

技术标签:

【中文标题】Strava API v3 获取所有运动员活动中的访问令牌问题【英文标题】:Problem with access token in Strava API v3 GET all athlete activities 【发布时间】:2019-03-23 15:23:41 【问题描述】:

我无法从 Strava 的 api 文档中的 url 访问所有运动员活动(我自己的)。

我能够获得自己的年初至今统计数据:

https://www.strava.com/api/v3/athletes/XXXXXXXX/stats?access_token=ACCESSTOKEN

我可以获取我的个人资料信息:

https://www.strava.com/api/v3/athlete?access_token=ACCESSTOKEN

但是当我尝试获取所有活动时:

https://www.strava.com/api/v3/athlete/activities?access_token=ACCESSTOKEN

我收到以下错误:


    "message": "Authorization Error",
    "errors": [
        
            "resource": "AccessToken",
             "field": "activity:read_permission",
             "code": "missing"
        
    ]

我需要在 url 中的某处包含我的客户端 ID 或密钥吗?我已登录,所以不明白为什么我无法访问自己的信息。请指教????

【问题讨论】:

如果这是最近的问题,请注意 4 天前他们更改了身份验证过程:developers.strava.com/docs/oauth-updates。你是如何获得你的 ACCESS_TOKEN 的? 【参考方案1】:

2018 年 10 月 15 日,Strava 增强了 authorization 流程,引入了新的 scopes 列表。

您是否正在使用在 https://www.strava.com/settings/api 上找到的访问令牌?

这个令牌有 scope:read 可能不足以做你想做的事(即你的活动是公开的还是私人的?)。

如果您需要具有不同范围的新令牌,您必须遵循这些steps。

第 1 步:将用户重定向到 Strava 的授权页面:

https://www.strava.com/oauth/authorize?
    client_id=YOUR_CLIENT_ID&
    redirect_uri=YOUR_CALLBACK_DOMAIN&
    response_type=code&
    scope=YOUR_SCOPE

第 2 步:从响应中读取 code 参数:

http://YOUR_CALLBACK_DOMAIN/?
    state=&
    code=AUTHORIZATION_CODE_FROM_STRAVA&
    scope=YOUR_SCOPE

第 3 步:使用包含授权码的 POST 请求新的访问令牌;您会在 JSON 响应中找到新的 access_token

https://www.strava.com/oauth/token?
    client_id=YOUR_CLIENT_ID&
    client_secret=YOUR_CLIENT_SECRET&
    code=AUTHORIZATION_CODE_FROM_STRAVA&
    grant_type=authorization_code

您可以在application page 中找到客户端 ID、客户端密码和回调域。

您可以在此documentation 中找到新范围的列表。

如果您是唯一使用您的应用程序的人,您可以使用浏览器手动执行前两个步骤,并将http://localhost 作为回调域。

【讨论】:

谢谢 tezzo!我会更多地解决这个问题,可能会有更多问题要问你。 正如 tezzo 提到的,您可以在浏览器中执行步骤 1 和 2。我成功地使用邮递员(HTTP 客户端)为第 3 步创建了我的 POST 请求,该请求返回了访问和刷新令牌。 我能够使用 scope:read_all 创建令牌,并且能够获得我的俱乐部 (/api/v3/athlete/clubs),但要求运动员活动给了我相同的身份验证错误。 . 这是因为我没有使用永久令牌吗? 抱歉@SebastienPattyn,但我不知道:我一直使用 Strava API 仅读取我的活动,因此我不知道读取其他运动员活动的最小范围/授权。 @tezzo 当我在步骤 1 中尝试使用 localhost 时,浏览器显示“localhost 拒绝连接”。【参考方案2】:

我没有足够的积分来评论,但我最近确实这样做了!

为了使其正常工作,您必须在步骤 1 中设置 scope=activity:read(而不是“scope=read”)。

【讨论】:

好收获!我遵循了当前的oauth example,不得不将生成的重定向url从scope=public更新为scope=activity:read 太棒了!帮了我很多【参考方案3】:

Strava api 访问...这个简短的 youtube 视频将引导您完成这些步骤。 https://www.youtube.com/watch?v=sgscChKfGyg 这是 github 上的一个文本文件,其中包含相应的链接。 https://github.com/franchyze923/Code_From_Tutorials/blob/master/Strava_Api/request_links.txt

/// get a new access token because it changes. Step 3 in the text file
        var value = new Dictionary<string, string>
         
             "client_id", "abc" ,
             "client_secret", "defg" ,
             "refresh_token", "highlmnop" ,
             "grant_type", "refresh_token" 
         ;

        var content = new FormUrlEncodedContent(value);
        var result = await client.PostAsync("https://www.strava.com/oauth/token", content);
        string resultContent = await result.Content.ReadAsStringAsync();
        var stravaDetails = JsonConvert.DeserializeObject<StravaRoot>(resultContent);
        // end get new access token


 public class StravaRoot
    
        public string token_type  get; set; 
        public string access_token  get; set; 
        public int expires_at  get; set; 
        public int expires_in  get; set; 
        public string refresh_token  get; set; 
    

【讨论】:

以上是关于Strava API v3 获取所有运动员活动中的访问令牌问题的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch:如何将 Strava 数据导入 Elastic Stack

无法使用 jQuery 执行 POST 请求以获取 Strava OAuth 令牌

只需一次调用 MailChimp API v3 即可获取所有 mailchimp 活动的详细信息

使用私有 URL 和 google api v3 共享 google 日历活动

为啥我的 GPX 上传不显示在我的 Strava 仪表板上?

使用maleorang v3.0 java api发送mailchimp活动