资源所有者密码授予 "must be a POST request"

Resource Owner Password Grant "must be a POST request"

我一直在尝试使用 Resource Owner Password Grant oAuth 登录,但我似乎无法正常工作。

我没有构建将请求发送到的后端,我正在使用 Invision Power Board's。我找不到任何使用简单 fetch 的示例请求,所以我不确定我是否做错了什么。

这是我发送给客户端的请求:

const form = {
  'grant_type': 'password',
  'username': 'username',
  'password': 'pass',
  'scope': 'profile',
  'client_id': 'client_id',
}
  var formBody = [];
  for (var property in form) {
    var encodedKey = encodeURIComponent(property);
    var encodedValue = encodeURIComponent(form[property]);
    formBody.push(encodedKey + "=" + encodedValue);
  }
  formBody = formBody.join("&");
  await fetch(`https://example.com/oauth/token`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
    },
    body: formBody
  })

我得到的只是一个错误:

{
    "error": "invalid_request",
    "error_description": "request must be a POST request"
}

我的格式设置有误还是我遗漏了什么?我一直在关注 oAuth 文档,但也许我误解了如何执行此操作。

我的服务器有问题吗?

编辑 - 使用 reqbin 的示例请求:

POST /oauth/token HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 85

grant_type=password&username=username&password=pass&scope=profile&client_id=client_id

奇怪的是这里的回复是:

{
    "error": "invalid_client"
}

您正在使用 POST 方法,但您的请求正文不是有效的 application/x-www-form-urlencoded 文件。

查看如何将对象转换为 urlencoded 字符串并在此处发送:

根据规范,密码流需要用户凭据和客户端凭据。但我没有看到您的请求有授权 header。