如何在 JavaScript 中使用 POST 方法获取 API 的访问令牌?

问题描述 投票:0回答:2

我想要获取凭据的 API 使用 OAuth2。 API 的文档列出了以下内容:

Request access token:

POST: auth/access_token

Url Parms:
grant_type    : "client_credentials"
client_id     :  Client id
client_secret :  Client secret

我从中想到的是,我需要将 JSON 对象作为字符串发送,所以我在 JavaScript 中尝试了这一点。

var xhr = new XMLHttpRequest();
    xhr.open("POST","url for the api",false);
    
    var obj = {
       
       "POST": "auth/access_token",
       "Url Parms": [   
          {
             "grant_type":'\"client_credentials\"',
             "client_id": "My Client id",
             "client_secret": "My Client secret"
          }
       ]
    };
    
    var clientcred = JSON.stringify(obj);
    xhr.send(obj);

这给我的只是一个 JSON,它表示我犯了一个错误。

{"error":"invalid_request","error_description":"The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed. Check the \"grant_type\" parameter."}

由于“同源策略”,该代码实际上甚至无法工作。我使用了一个扩展来解决这个问题。但我已经完成了。我想不通。我需要学习php之类的东西吗?如何获取我的访问令牌。

编辑:

它可能需要 URL 中的参数,因此 POST auth/access_token?grant_type=client_credentials&client_id=idu200c&client_secret=clienu200ct_secret 或可能 POST auth/access_token/client_credentials/id/client_secret – Sara Tibbetts 8 小时前

这就做到了。我醒来后,我尝试的第一件事就成功了。非常感谢@Sara Tibbetts 和其他所有试图帮助我的人。

编辑2:

扩展是一个糟糕的解决方法,从那时起我了解了跨源资源共享。我应该从服务器进行 API 调用,而不是在客户端进行,这实际上也是安全的。

javascript json oauth-2.0
2个回答
0
投票

这就是我在工作的 Prod 程序中执行此操作的方式(它使用我之前获得的身份验证代码 - 但这并不重要,这只是不同的参数 - 将我的具有身份验证代码的东西替换为客户端秘密要求,并且尝试一下..我认为你只是太努力了。

var xhr = new XMLHttpRequest();

我使用字符串作为参数:

var data =
'resource=[my resource]' +
'&client_id=' + clientId +
'&code=' + authCode +
'&grant_type=authorization_code' +
'&response_type=token';
var dataFinal = encodeURI(data);

然后我将其发布为:

xhr.open('POST', url, true);
xhr.withCredentials = true;
xhr.setRequestHeader('Access-Control-Allow-Origin', '[something]');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onreadystatechange = function () {
    if (xhr.readyState == 4) {
        //do something
    }
}
xhr.send(dataFinal);

0
投票

您可以尝试如下所示的操作。实际上需要将 json 设置为 data 属性。

$.ajax({
type: 'POST',
url: 'https://url.com',
crossDomain: true,
data: JSON.stringify({grant_type    : "client_credentials",
    client_id     :  "My Client id",
    client_secret :  "My Client secret"}),
dataType: 'json',
success: function(responseData, textStatus, jqXHR) {
    console.log(responseData);
},
error: function (responseData, textStatus, errorThrown) {
    alert('POST failed.');
}});
© www.soinside.com 2019 - 2024. All rights reserved.