框oauth2:缺少grant_type参数或参数无效

时间:2013-03-07 11:28:25

标签: oauth-2.0 box-api

我不知道自己做错了什么,但每当我尝试获取令牌时(当然在用户身份验证之后),结果总是无效的grant_type参数或参数丢失

可能与Box API always returns invalid grant_type parameter on obtaining access token

有关

这是我的小提琴结果:

POST https://api.box.com/oauth2/token HTTP/1.1
Host: api.box.com
Content-Length: 157
Expect: 100-continue
Connection: Keep-Alive

grant_type=authorization_code&code=nnqtYcoik7cjtHQYyn3Af8uk4LG3rYYh&client_id=[myclientId]&client_secret=[mysecret]

结果:

HTTP/1.1 400 Bad Request
Server: nginx
Date: Thu, 07 Mar 2013 11:18:36 GMT
Content-Type: application/json
Connection: keep-alive
Set-Cookie: box_visitor_id=5138778bf12a01.27393131; expires=Fri, 07-Mar-2014 11:18:35 GMT; path=/; domain=.box.com
Set-Cookie: country_code=US; expires=Mon, 06-May-2013 11:18:36 GMT; path=/
Cache-Control: no-store
Content-Length: 99

{"error":"invalid_request","error_description":"Invalid grant_type parameter or parameter missing"}

即使遵循curl示例也会出现同样的错误。任何帮助将不胜感激。

编辑:尝试使用其他redirect_uri参数,但仍然是相同的错误

POST https://api.box.com/oauth2/token HTTP/1.1
Content-Type: application/json; charset=UTF-8
Host: api.box.com
Content-Length: 187
Expect: 100-continue
Connection: Keep-Alive

grant_type=authorization_code&code=R3JxS7UPm8Gjc0y7YLj9qxifdzBYzLOZ&client_id=*****&client_secret=*****&redirect_uri=http://localhost

结果:

HTTP/1.1 400 Bad Request
Server: nginx
Date: Sat, 09 Mar 2013 00:46:38 GMT
Content-Type: application/json
Connection: keep-alive
Set-Cookie: box_visitor_id=513a866ec5cfe0.48604831; expires=Sun, 09-Mar-2014 00:46:38 GMT; path=/; domain=.box.com
Set-Cookie: country_code=US; expires=Wed, 08-May-2013 00:46:38 GMT; path=/
Cache-Control: no-store
Content-Length: 99

{"error":"invalid_request","error_description":"Invalid grant_type parameter or parameter missing"}

5 个答案:

答案 0 :(得分:14)

除了对参数进行正确的URL编码外,Box似乎还需要正确的Content-Type: application/x-www-form-urlencoded请求标头。同样似乎适用于刷新和撤销请求。

此外,根据RFC 6749redirect_uri仅为

  

如果“redirect_uri”参数包含在授权请求中,则需要

  如第4.1.1节所述,它们的值必须相同。

答案 1 :(得分:2)

我遇到了类似的问题。

  • 问题不在于Content-Type。
  • 问题在于您收到的代码的生命周期。

大多数地方未提及的一个关键方面是重定向的代码仅持续 30秒

要获取访问令牌和刷新令牌,您必须在30秒或更短时间内发布帖子请求。

如果您没有这样做,则会收到规定的错误。我找到了信息here

下面的代码对我有用。请记住,30秒规则。

import requests

url = 'https://api.box.com/oauth2/token'

data = [
    ('grant_type', 'authorization_code'),
    ('client_id', 'YOUR_CLIENT_ID'),
    ('client_secret', 'YOUR_CLIENT_SECRET'),
    ('code', 'XXXXXX'),
]

response = requests.post(url, data=data)

print(response.content)

希望有所帮助。

答案 2 :(得分:1)

您缺少重定向URI参数。尝试:

POST https://api.box.com/oauth2/token HTTP/1.1
Host: api.box.com
Content-Length: 157
Expect: 100-continue
Connection: Keep-Alive

grant_type=authorization_code&code=nnqtYcoik7cjtHQYyn3Af8uk4LG3rYYh&client_id=[myclientId]&client_secret=[mysecret]&redirect_uri=[your-redirect-uri]

答案 3 :(得分:0)

我也面临着实现oauth2的同样问题。我添加了Content-Type: application/x-www-form-urlencoded。当我添加content-type时,我的问题就解决了。

检查并添加有效的content-type

答案 4 :(得分:0)

不知道将来可能会用到谁,但是请确保您正在发送POST请求以获取访问令牌,并且不尝试使用GET来检索它,或者如果您要进行测试-粘贴在地址栏中不会成功”要正常工作,您需要发送POST请求。

代码只持续30秒。

相关问题