Sage One API - unsupported_grant_type
2016-8-22 8:15:7
收藏:0
阅读:61
评论:2
我正在尝试按照 文档 使用 Guzzle (v6) / Laravel 5.2 (Laravel 对此问题不相关),获取 Sage One API 的访问令牌,但卡在"请求访问令牌"阶段。
错误
客户端错误:`POST https://api.sageone.com/oauth2/token`的响应为
`400 Bad Request`:{"error":"unsupported_grant_type"}
问题代码
$client = new Client([
'base_uri'=>'https://api.sageone.com',
'headers' => ['content_type' => 'application/x-www-form-urlencoded']
]);
$data = [
'client_id' => getenv('SAGE_CLIENT'),
'client_secret' => getenv('SAGE_SECRET'),
'code' => $request->code,
'grant_type' => 'authorization_code',
'redirect_uri'=>'https://myurl.com/sage/refresh'
];
$response = $client->request('POST','/oauth2/token',['json' => $data]);
文档中说明了 **_"grant_type - 代码所涉及的授权类型。授权码或刷新令牌。"_**,我尝试了两种方式。其他变量都是正常可行的,但是 grant_type 看起来是不行的。
更新1 调试头文件生成以下输出。
* Hostname in DNS cache was stale, zapped * Trying 52.49.116.133...
* Connected to api.sageone.com (52.49.116.133) port 443 (#0)
* CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none
* ALPN/NPN, server did not agree to a protocol
* SSL connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate:
* subject: CN=api.sageone.com,O=The Sage Group PLC,L=Newcastle Upon Tyne,ST=Newcastle Upon Tyne,C=GB,serialNumber=02231246,businessCategory=Private Organization,incorporationCountry=GB
* start date: May 12 00:00:00 2014 GMT
* expire date: May 11 23:59:59 2016 GMT
* common name: api.sageone.com
* issuer: CN=GeoTrust Extended Validation SSL CA - G2,O=GeoTrust Inc.,C=US > POST /oauth2/token HTTP/1.1 Host: api.sageone.com content_type: application/x-www-form-urlencoded User-Agent: GuzzleHttp/6.1.1 curl/7.43.0 PHP/5.6.18 Content-Type: application/x-www-form-urlencoded Content-Length: 216
* upload completely sent off: 216 out of 216 bytes < HTTP/1.1 400 Bad Request < Content-Type: application/json < Date: Tue, 08 Mar 2016 10:53:09 GMT < Server: openresty < Content-Length: 26 < Connection: keep-alive <
* Connection #0 to host api.sageone.com left intact
点赞
用户4621324
将 JSON 用于 oAuth 真的是不正确的:https://www.rfc-editor.org/rfc/rfc6749#section-4.1.3
我认为这是不正确的:
$response = $client->request('POST','/oauth2/token',['json' => json_encode($data)]);
相反,我会尝试这个:
$response = $client->post('/oauth2/token', [], $data);
或者这个
$response = $client->post('/oauth2/token', ['body' => $data]);
另外一个问题,第一个调用 https://www.sageone.com/oauth2/auth - 是否已经通过了?
2016-03-13 18:45:10
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
你正在以 JSON 编码的数据 POST 值,但是你应该以表单编码 POST。参见:http://docs.guzzlephp.org/en/latest/request-options.html#form-params,因此,
$response = $client->request('POST','/oauth2/token',['form_params' => $data]);编辑:
你应该再次检查你的代码,因为我刚刚验证和核实了这一变化在实时的 sage 环境中可以正常工作。我使用的完整代码:
<?php require 'vendor/autoload.php'; $client = new GuzzleHttp\Client([ 'base_uri'=>'https://api.sageone.com', 'headers' => ['content_type' => 'application/x-www-form-urlencoded'] ]); $data = [ 'client_id' => getenv('SAGE_CLIENT'), 'client_secret' => getenv('SAGE_SECRET'), 'code' => getenv('SAGE_CODE'), 'grant_type' => 'authorization_code', 'redirect_uri'=>'https://myurl.com/sage/refresh' ]; $response = $client->request('POST','/oauth2/token',['form_params' => $data]); echo $response->getBody(); ?>