验证访问受限 SODA 数据集的请求
Authenticating request to access restricted SODA dataset
我正在关注 SODA documentation about authorization 使用 OAuth 查询受限数据集(我的帐户有权访问)。我已使用我的客户端密钥成功接收并存储了访问令牌。现在我正在尝试用它发出 AJAX 请求。这是我的代码:
var api_access_token = "OAuth " + stored_access_token;
jQuery.ajax({
url: "https://url/to/dataset.json",
type: "GET",
headers: {
'Authorization': api_access_token,
'X-App-Token': my_app_token
}
})
.done(function( data ) {
console.log(data);
});
但这似乎不起作用。我也尝试过使用 jQuery 的 "beforeSend" 属性 得到相同的结果。这是我收到的:
{
"error" : true,
"message" : "You must be logged in to access this resource"
}
如果我使用 cURL 尝试此请求:
$headers = array(
'Content-Type: application/json',
sprintf('Authorization: OAuth %s', $access_token)
);
$curl = curl_init("https://url/to/dataset.json");
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($curl);
$response_data = json_decode($response, TRUE);
var_dump($response_data);
然后我得到以下(不同的)错误:
"Bad OAuth token"
有什么想法吗?
编辑
应用程序回调前缀:https://example.org
- 获取授权码
https://example.org/dashboard
这里我有一个锚标签,看起来像这样:
<a href="https://soda.demo.socrata.com/oauth/authorize?client_id=' . $app_id . '&response_type=code&redirect_uri=https://example.org/dashboard">Authorize DOIT here.</a>
这让我进入要求允许访问的 SODA 页面
- 正在获取访问令牌
我被重定向到这里:
https://example.org/dashboard/?code=CODE_HERE
然后服务器端脚本使用 curl 向 post 请求访问代码(如上所示),我成功接收并存储为 cookie。
- 使用访问令牌
从同一页面 (https://example.org/dashboard/?code=CODE_HERE) 我尝试请求私有数据集,但失败了,如上所述。
这是问题吗,我从 https://example.org/dashboard 请求授权码,然后从 https://example.org/dashboard?code=[=63 查询数据=]
回答您的第一个问题,假设您尝试在用户浏览器的客户端使用 JavaScript 进行身份验证,即使您获得了 OAuth 令牌,您也将无法使用它通过 CORS 或 JSONP。为了安全起见,我们放弃了对 cross-domain 请求的所有身份验证 headers,因为这是 XSS 攻击的载体。更多信息:https://dev.socrata.com/docs/cors-and-jsonp.html
至于你的 PHP libcurl 请求发生了什么,我不确定那里发生了什么。根据您遇到的错误,您的身份验证令牌似乎正在进入系统,但我的猜测是您的 OAuth 令牌有些损坏,或者在您尝试时它已过期。令牌的有效期约为一小时 window。
编辑您的 OAuth 令牌错误问题的答案:更改您的 /oauth/authorize
URL 以反映您尝试验证的域,而不是 soda.demo.socrata.com
。令牌与发行它们的域相关联。我会更新文档以使其更清楚。
我正在关注 SODA documentation about authorization 使用 OAuth 查询受限数据集(我的帐户有权访问)。我已使用我的客户端密钥成功接收并存储了访问令牌。现在我正在尝试用它发出 AJAX 请求。这是我的代码:
var api_access_token = "OAuth " + stored_access_token;
jQuery.ajax({
url: "https://url/to/dataset.json",
type: "GET",
headers: {
'Authorization': api_access_token,
'X-App-Token': my_app_token
}
})
.done(function( data ) {
console.log(data);
});
但这似乎不起作用。我也尝试过使用 jQuery 的 "beforeSend" 属性 得到相同的结果。这是我收到的:
{
"error" : true,
"message" : "You must be logged in to access this resource"
}
如果我使用 cURL 尝试此请求:
$headers = array(
'Content-Type: application/json',
sprintf('Authorization: OAuth %s', $access_token)
);
$curl = curl_init("https://url/to/dataset.json");
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($curl);
$response_data = json_decode($response, TRUE);
var_dump($response_data);
然后我得到以下(不同的)错误:
"Bad OAuth token"
有什么想法吗?
编辑
应用程序回调前缀:https://example.org
- 获取授权码
https://example.org/dashboard 这里我有一个锚标签,看起来像这样:
<a href="https://soda.demo.socrata.com/oauth/authorize?client_id=' . $app_id . '&response_type=code&redirect_uri=https://example.org/dashboard">Authorize DOIT here.</a>
这让我进入要求允许访问的 SODA 页面
- 正在获取访问令牌
我被重定向到这里:
https://example.org/dashboard/?code=CODE_HERE
然后服务器端脚本使用 curl 向 post 请求访问代码(如上所示),我成功接收并存储为 cookie。
- 使用访问令牌
从同一页面 (https://example.org/dashboard/?code=CODE_HERE) 我尝试请求私有数据集,但失败了,如上所述。
这是问题吗,我从 https://example.org/dashboard 请求授权码,然后从 https://example.org/dashboard?code=[=63 查询数据=]
回答您的第一个问题,假设您尝试在用户浏览器的客户端使用 JavaScript 进行身份验证,即使您获得了 OAuth 令牌,您也将无法使用它通过 CORS 或 JSONP。为了安全起见,我们放弃了对 cross-domain 请求的所有身份验证 headers,因为这是 XSS 攻击的载体。更多信息:https://dev.socrata.com/docs/cors-and-jsonp.html
至于你的 PHP libcurl 请求发生了什么,我不确定那里发生了什么。根据您遇到的错误,您的身份验证令牌似乎正在进入系统,但我的猜测是您的 OAuth 令牌有些损坏,或者在您尝试时它已过期。令牌的有效期约为一小时 window。
编辑您的 OAuth 令牌错误问题的答案:更改您的 /oauth/authorize
URL 以反映您尝试验证的域,而不是 soda.demo.socrata.com
。令牌与发行它们的域相关联。我会更新文档以使其更清楚。