当前位置: 首页 > 知识库问答 >
问题:

x-www-form-urlencoded格式-在node.js中使用https

古扬
2023-03-14

我目前正在编写API以尝试获得代币。我快到了,但在最后一关跌倒了…

const fs = require('fs');
const https = require('https');
const ConfigParams = JSON.parse(fs.readFileSync('Config.json', 'utf8'));
const jwt = require('jsonwebtoken');
const apikey = ConfigParams.client_id;


var privateKey = fs.readFileSync(**MY KEY**);
var tkn;

const jwtOptions = {
    algorithm: 'RS512',
    header: { kid: 'test-1' }
}


const jwtPayload = {
    iss: apikey,
    sub: apikey,
    aud: **API TOKEN ENDPOINT**,
    jti: '1',
    exp: 300
}

jwt.sign(jwtPayload,
    privateKey,
    jwtOptions,
    (err, token) => {
        console.log(err);
        //console.log(token);
        tkn = token;

        let = tokenPayload = {
            grant_type: 'client_credentials',
            client_assertion_type: 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer/',
            client_assertion: tkn
        }

        tokenAuthOptions = {
            payload: tokenPayload,
            host: **HOST**,
            path: **PATH**,
            method: 'POST',
            

        }
          
        https.request(
            tokenAuthOptions,
            resp => {
                var body = '';
                resp.on('data', function (chunk) {
                    body += chunk;
                });
                resp.on('end', function () {
                    console.log(body);
                    console.log(resp.statusCode);
                });
            }
        ).end(); 
    }
)

编码的令牌在第一部分返回正常,https请求尽管返回了问题。

我得到的响应是grant_type丢失,所以我知道由于这个x-www-form-urlencoded我有一个格式问题,但是我不知道如何修复它。

这是网站所说的:

您需要在请求正文中以 x-www-form-urlencode 格式包含以下数据:

grant _ type = client _ credentials client _ assertion _ type = urn:IETF:params:oauth:client-assertion-type:jwt-bearer client _ assertion =

curl-X POST-H“内容类型:application/X-www-form-urlencoded”--data\“grant_type=client_credentials\

理想情况下,我想要一个使用https请求的解决方案,但如果不可能,我愿意接受其他解决方案。

任何帮助都非常感谢。

谢谢克雷格

编辑-我根据以下建议更新了代码:

const params = new url.URLSearchParams({
    grant_type: 'client_credentials',
    client_assertion_type: 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer/',
    client_assertion: tkn
});

axios.post("URL", params.toString()).then(resp => {
    console.log("response was : " + resp.status);
}).catch(err => {
    console.log("there was an error: " + err);
})

但我仍然收到错误代码400,但现在不太详细说明原因。(错误代码400有多条消息失败)

共有1个答案

慕容修伟
2023-03-14

邮差是最好的。

感谢@Anatoly的支持,它帮助我找到了正确的方向。我第一次使用postman时运气不好,发现它有一个代码片段部分,使用node.js有四种不同的实现方式。

Axion的解决方案是:

const axios = require('axios').default;
const qs = require('qs');

        var data = qs.stringify({
            'grant_type': 'client_credentials',
            'client_assertion_type': 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer',
            'client_assertion': tkn
        });
        var config = {
            method: 'post',
            url: '',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded'
            },
            data: data
        };

        axios(config)
            .then(function (response) {
                console.log(JSON.stringify(response.status));
            })
            .catch(function (error) {
                console.log(error);
            });

我认为问题是,我没有将信息传递到“data:”中,同时还存在查询字符串问题。使用qs。stringify格式化对象,然后将其传递给data:key解决了这个问题。

 类似资料: