2017-02-10 81 views
0

我在使用OAuth查询受限制的数据集(即我的帐户有权访问)的SODA documentation about authorization。我已经使用我的客户端密钥成功接收和存储访问令牌。现在我试图用它做出一个AJAX请求。这是我的代码:验证访问受限制的SODA数据集的请求

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

  1. 获取授权码

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> 

这让我来,要求允许访问苏打页

  • 获得访问令牌
  • 我在这里重定向:

    https://example.org/dashboard/?code=CODE_HERE 
    

    然后服务器端脚本使用curl发布访问代码的请求(如上所示),我成功接收并存储为cookie。

  • 使用访问令牌
  • 从同一页(https://example.org/dashboard/?code=CODE_HERE)我尝试请求的私有数据集,如上面所详述的,其失败。

    是这个问题,我从https://example.org/dashboard请求授权码,然后从https://example.org/dashboard?code=CODE_HERE

    +0

    你对该域名发出了哪个域名?您必须针对与您使用该标记相同的域名使用OAuth。我认为这可能是问题所在。 – chrismetcalf

    +0

    用我正在使用的域和流编辑我的问题。 – duncanrager

    +0

    是的,改变你的'/ oauth/authorize' URL来反映你想要认证的域名,而不是'soda.demo.socrata.com'。令牌与他们签发的域名绑定。我会更新文档以使其更清楚。 – chrismetcalf

    回答

    1

    查询数据来回答第一个问题,假设你想在用户的浏览器做在客户端验证使用JavaScript,即使您获得该OAuth令牌,您也无法通过CORS或JSONP使用该令牌。为了安全起见,我们放弃了跨域请求的所有身份验证标头,因为这是XSS攻击的一个向量。更多这里:https://dev.socrata.com/docs/cors-and-jsonp.html

    至于你的PHP libcurl请求发生了什么,我不知道那里发生了什么。看起来您的身份验证令牌正在进入系统,基于您遇到的错误,但我的猜测是,您的OAuth令牌已损坏,或者在您尝试使用该令牌时已过期。令牌具有约一小时到期时间窗口。

    编辑并解答您的OAuth令牌错误问题:更改您的/oauth/authorize网址以反映您尝试使用的域验证,而不是soda.demo.socrata.com。令牌与他们签发的域名绑定。我会更新文档以使其更清楚。

    +0

    了解客户端。对于服务器端代码,我在获取包含我的访问令牌的响应后立即发出受保护的资源请求,似乎排除了过期。这会导致腐败,你会建议排除这个问题吗? – duncanrager