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

Posted

技术标签:

【中文标题】无法使用 jQuery 执行 POST 请求以获取 Strava OAuth 令牌【英文标题】:Unable to perform POST request using jQuery to obtain Strava OAuth token 【发布时间】:2016-03-25 17:09:15 【问题描述】:

我在尝试使用 Strava API 检索访问令牌时遇到问题:https://strava.github.io/api/v3/oauth/

我的初始代码请求和回调函数正常,但是当尝试点击/oauth/token URL 时,我以两种不同的方式失败。第一个:

        console.log('Posting to /token with code: ' + code);
        Ember.$.ajax(
            type: 'POST',
            url: 'https://www.strava.com/oauth/token',
            data: 'client_id=<myid>&client_secret=<mysecret>&code=' + code,
            success: function(data) 
                var jsonData = JSON.stringify(data);
                var accessToken = jsonData.access_token;
                console.log('Received access token: ' + accessToken);
                if (accessToken) 
                    this.get("controllers.application").set('settings.strava.accessKey', accessToken);
                
            ,
            error: function(jqXHR, textStatus) 
                console.log('API auth error occurred: ' + JSON.stringify(error));
                throw new Error(error);
            
        );

打印 Posting to /token with code: 3ae248f... 并且 HTTP 请求返回 200 响应(在 Chrome 调试器网络选项卡中),但我实际上无法查看调试器中的响应内容/数据,并且浏览器控制台抱怨:

XMLHttpRequest 无法加载 https://www.strava.com/oauth/token。不 请求中存在“Access-Control-Allow-Origin”标头 资源。因此不允许使用原点“http://localhost:4200” 访问。

但是,如果我在上述请求中添加一些选项:

        crossDomain: true,
        headers: 
            'Access-Control-Allow-Origin': '*',
            'Access-Control-Allow-Methods': 'DELETE, HEAD, GET, OPTIONS, POST, PUT',
            'Content-Type': 'application/json;charset=UTF-8'
        ,

然后OPTIONS 请求首先发出(到/oauth/token 端点),然后返回302 Found,但随后我在浏览器控制台中看到不同 错误:

XMLHttpRequest 无法加载 https://www.strava.com/oauth/token。预检响应无效(重定向)

CORS 不是我有大量经验的东西,这就是我没有想法的地方。

【问题讨论】:

这里好像不支持 CORS。你必须做这个服务器端 我正在使用 Strava API - 我不控制此服务器。而且 API 已经存在(并使用)了一段时间,所以做错了。 这不是我的服务器。这是我要连接的第三方服务器。 你必须从你的服务器向api服务器发出请求 对 - 所以我的问题是,我需要做什么才能连接到这个 API? 【参考方案1】:

对于预检请求响应应以状态 200 Ok 结束并且至少包含 Access-Control-Allow-Origin: your origin

【讨论】:

这与我目前使用的通配符来源有何不同? 'Access-Control-Allow-Origin': '*', 您应该在响应中得到它,而不是在您的请求中发送,它没有意义。 @CraigOtis,你的网站有后端应用吗? 这不是一个网站 - 它是一个在本地运行的 EmberJS 应用程序,并使用 jQuery 轮询 Strava API。 好的,我换个方式问。此代码是否在浏览器中运行?【参考方案2】:

以下在我的 Cordova 应用程序中运行良好:

var c_id = "YOUR_ID_HERE";
var c_secret = "YOUR_SECRET_HERE";
var access_code = "YOUR_AUTH_HTTP_CODE_HERE";
var params = "client_id=" + c_id + "&client_secret=" + c_secret + "&code=" + access_code;

xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function () 
  if (xmlhttp.readyState == 4 && xmlhttp.status == 200) 
    alert(xmlhttp.responseText);
  


xmlhttp.open("POST", "https://www.strava.com/oauth/token", true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.setRequestHeader("Content-length", params.length);
xmlhttp.setRequestHeader("Connection", "close");
xmlhttp.send(params);

【讨论】:

我们可以向 strava 发送注销请求吗?? 我不知道。但是您可以“忘记”应用端的令牌并按照第一次授权重新授权。 我想做的是当用户从我的应用程序中注销时,我想同时从我的应用程序和 strava 中注销用户。可以这样做吗? 不,我不知道。

以上是关于无法使用 jQuery 执行 POST 请求以获取 Strava OAuth 令牌的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 wininet 获取 POST 请求响应

jQuery POST 多线程延迟

将 jquery ajax POST 请求更改为 fetch api POST

POST 请求无法使用 JQuery AJAX

如何发送 POST 请求以使用 jquery 登录到 url

jQuery.post(url, [data], [callback], [type])