首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对Feedly的授权请求会引发错误的请求吗?

对Feedly的授权请求会引发错误的请求吗?
EN

Stack Overflow用户
提问于 2016-10-02 06:17:02
回答 2查看 844关注 0票数 2

目的是将授权代码交换为访问和刷新令牌。

错误:

代码语言:javascript
复制
GuzzleHttp\Exception\ClientException #400

Client error response 
[url] http://sandbox.feedly.com/v3/auth/token?code=[auth_code]&client_id=sandbox&client_secret=[secret]&redirect_uri=https%253A%252F%252F[site url]&grant_type=authorization_code&state=%23 
[status code] 400 
[reason phrase] Bad Request

相关代码:

代码语言:javascript
复制
$client = new GuzzleHttp\Client();
$parameters = ['code'=>$_GET['code'],'client_id'=>'sandbox','client_secret'=> '[secret]','redirect_uri'=>urlencode('https://[site url]'),'grant_type'=>'authorization_code', 'state'=>'#'];
$params = http_build_query($parameters);
$request = $client->createRequest('POST', 'http://sandbox.feedly.com/v3/auth/token?'.$params);
$request->addHeader('Accept-Encoding','GZIP');
$request->setHeader('Authorization', "auth-code");
$request->addHeader('Content-Type','application/json');
$response = $client->send($request);
var_dump($response->json());

也尝试了state = "state.passed.in",但抛出了相同的错误。

您能指出代码片段中的错误吗?它使用Feedly v3沙箱和。

如果遵循请求URL,则会抛出"get不允许“。

更新代码片段:

代码语言:javascript
复制
$client = new GuzzleHttp\Client();
    $parameters = ['code'=>$_GET['code'],'client_id'=>'sandbox','client_secret'=> '[secret]','redirect_uri'=>urlencode('https://[site url]'),'grant_type'=>'authorization_code', 'state'=>'#'];
    $params = http_build_query($parameters);
    $request = $client->createRequest('POST', 'http://sandbox.feedly.com/v3/auth/token?'.$params);
    $response = $client->send($request);
    var_dump($response->json());

更新代码上的错误:

代码语言:javascript
复制
GuzzleHttp\Exception\ServerException #522

Server error response [url] http://sandbox.feedly.com/v3/auth/token?code=[auth_code]&client_id=sandbox&client_secret=[secret]&redirect_uri=https%253A%252F%252F[site url]&grant_type=authorization_code&state=%23 
[status code] 522 
[reason phrase] Origin Connection Time-out  

注意:更新代码抛出了相同的错误(几个小时后),即

代码语言:javascript
复制
GuzzleHttp\Exception\ClientException #400

Client error response 
[url] http://sandbox.feedly.com/v3/auth/token?code=[auth_code]&client_id=sandbox&client_secret=[secret]&redirect_uri=https%253A%252F%252F[site url]&grant_type=authorization_code&state=%23 
[status code] 400 
[reason phrase] Bad Request
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-15 14:05:26

问题:重定向URI是双重编码的,也就是说,我将把https%253A%252F%252Fdev10.ritepush.com%252Fdashboard传递给https%3A%2F%2Fdev10.ritepush.com%2Fdashboard。我必须将uri编码一次,也就是说,我需要传递https%3A%2F%2Fdev10.ritepush.com%2Fdashboard

原因: PHP自动编码http请求,因此在将urlencode应用到redirect_uri时,我实际上对重定向URI进行了两次编码,但只解码了一次。因此,在请求体中传递编码URI,这将导致错误。

感谢,Feedly的David Chatenay指出了错误。

票数 1
EN

Stack Overflow用户

发布于 2016-10-03 12:10:18

从底部开始,按照OAuth 2.0规范:

客户端在发出访问令牌请求时必须使用HTTP "POST“方法。

(资料来源:第3.2节。OAuth 2.0授权框架)

因此,这解释了为什么导航到浏览器中的请求URL将失败(导航问题时只支持GETPOST请求)。

下一点是客户端身份验证,更具体地说,您如何提供client_idclient_secret参数,以便服务器能够验证您是一个受信任的客户端应用程序。同样,根据规范,该信息应该通过两种方式传递:

  1. 通过RFC2617中定义的HTTP基本身份验证方案,客户端标识符作为用户名传递,客户端秘密作为密码传递。此方法必须得到符合OAuth的服务器的支持,并且也是推荐的方法。*
  2. 通过将客户端凭据包括在请求体中,通常编码为application/x-www-form-urlencoded (参见下面的示例)。此方法是可选的,在某些OAuth服务器中可能不可用。

在请求主体中传递客户端凭据的示例:

代码语言:javascript
复制
POST https://YOUR_NAMESPACE/oauth/token
 Content-type: application/x-www-form-urlencoded

client_id=YOUR_CLIENT_ID
&redirect_uri=http://YOUR_APP/callback
&client_secret=YOUR_CLIENT_SECRET
&code=AUTHORIZATION_CODE
&grant_type=authorization_code

(来源:OAuth网络应用协议的第四步,单击第二步中的“平原链接”,查看完整授权代码授予流程中的所有原始HTTP请求)

现在,对于用例,我在文档中找不到任何关于支持HTTP身份验证的内容。关于将代码交换为访问令牌所需的参数,他们确实说了以下几点:

注意:这些参数可以作为表单值在URL中传递,也可以在JSON文档中传递。如果使用JSON文档,请确保在请求中传递“Content:application/json”标题。

(资料来源:将auth代码交换为刷新令牌和访问令牌。)

令人惊讶的是,它们似乎允许在URL本身传递客户端凭据,这是OAuth规范明确禁止的:

参数(client_id和client_secret)只能在请求体中传输,不能包含在请求URI中。

(资料来源:第2.3.1节。OAuth 2.0授权框架)

总之,根据他们的文档,您所做的事情(传递URL本身中的参数)应该是可能的,除非文档不是最新的,而且他们已经修复了不符合规范的地方,不再支持这一点。

此外,你做的事情很少看起来是错误的。code参数永远不会在Authorisation头中传递,因此,除非您想要使用基本身份验证在该标头中传递客户端凭据,否则我建议您删除这个标头。

我还将删除Accept-Encoding头,因为它们的文档除了返回JSON响应之外,没有提到支持其他任何东西。如果要维护该标头,请将值从gzip更改为application/json

最后,您也没有在请求体中发送任何数据,所以您可能也希望删除Content-Type头,因为Feedly可能会认为如果存在这个标头,那么数据就在请求中而不是URL上。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39814400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档