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

xoshrz7s  于 2023-10-15  发布在  其他
关注(0)|答案(6)|浏览(421)

我不知道我做错了什么,但每次我试图获取令牌(当然是在用户身份验证之后),结果总是无效的grant_type参数或参数丢失
可能与Box API always returns invalid grant_type parameter on obtaining access token有关
以下是我的Fiddler结果:

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"}
1szpjjfi

1szpjjfi1#

看起来Box需要正确的Content-Type: application/x-www-form-urlencoded请求头,以及正确的URL编码参数。这同样适用于刷新和撤销请求。
此外,根据RFC 6749,redirect_uri
如果“redirect_uri”参数包含在授权请求中(如第4.1.1节所述),则为必填,并且它们的值必须相同。

sq1bmfud

sq1bmfud2#

我也面临着类似的问题。

  • 问题不在于内容类型。
  • 问题在于您收到的代码的生命周期。

在大多数地方没有提到的一个关键方面是,您在重定向时获得的代码仅持续30秒
要获取访问令牌和刷新令牌,您必须在30秒或更短的时间内发出post请求。
如果你没有做到这一点,你会得到所述错误。我找到了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)

希望能帮上忙。

cbwuti44

cbwuti443#

您缺少重定向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]
9nvpjoqh

9nvpjoqh4#

我在实现oauth2时也遇到了同样的问题。添加Content-Type: application/x-www-form-urlencoded当我添加content-type时,我的问题解决了。
检查并添加有效的content-type

wxclj1h5

wxclj1h55#

不知道将来谁会需要这个,但要确保你发送的是一个POST请求来获取访问令牌,而不是试图使用GET来检索它,或者如果你正在测试-在地址栏中粘贴不起作用,你需要发送一个POST请求,其中的数据在BODY中,而不是作为查询参数。
此外,代码通常持续几秒钟,所以你需要使用它,只要它发送回来。

ni65a41a

ni65a41a6#

尝试所有解决方案后,如果错误仍然相同,请在server/app/index中尝试此中间件:

app.use(express.urlencoded({ extended: true }));

相关问题