php 在浏览器中HTTP POST请求时遇到授权错误,但在Postman上工作正常

vsdwdz23  于 2023-03-16  发布在  PHP
关注(0)|答案(1)|浏览(225)

我目前遇到了一个POST请求的问题。我有一个基本的用户名和密码验证的授权头。有趣的是,当我尝试使用Postman进行相同的请求时,它工作得很好。但是,当我尝试使用fetch进行相同的调用时,我遇到了错误401。您能帮助我解决这个问题吗?
下面是postman auth头文件(工作正常):

下面是获取调用(与相同的Authorization头一起使用:

const authHeader = {"Authorization": "Basic **********************"}

fetch(`${url}`, {
          method,
          body,
          headers:authHeader
        }).then((response) => {
          return response.json();
        })

我不知道这是否与问题有关,但添加信息以找到解决方案也无妨... API是用PHP编写的,托管在AWS ECS上。问题可能是由PHP或AWS引起的吗?

ffscu2ro

ffscu2ro1#

这个代码会起作用。

fetch(`${url}`, {
    method: method,
    headers: authHeader,
    body: body
})
    .then((response) => response.json())
    .then((body) => {
        console.log(body)
    })

演示Spotify获取令牌POST调用使用提取。

import fetch from 'node-fetch';

const url = 'https://accounts.spotify.com/api/token'
const method = 'POST'
const authHeader = { "Authorization": "Basic <your base64>" }
const body = new URLSearchParams({
    'grant_type': 'client_credentials'
})

fetch(`${url}`, {
    method: method,
    headers: authHeader,
    body: body
})
    .then((response) => response.json())
    .then((body) => {
        console.log(body)
    })

结果x1c 0d1x
或使用用户名/密码代替<base64>的版本2

const base64 = Buffer.from('<username>' + ":" + '<password>').toString('base64')
const authHeader = { "Authorization": `Basic ${base64}` }

代替

const authHeader = { "Authorization": "Basic <your base64>" }

VS代码中用户名/密码的屏幕截图

来自Postman的用户名/密码的屏幕截图

使用axios的替代方法

const axios = require('axios')
const base64 = require('base-64');

const getToken = async () => {
    try {
        const URL='https://accounts.spotify.com/api/token'
        const client_id = '<your username>'    // OR username
        const client_secret = '<your password>'    // OR password
        const response = await axios.post(URL,
            new URLSearchParams({
                'grant_type': 'client_credentials'
            }),
            {
                headers:
                {
                    'Content-Type': 'application/x-www-form-urlencoded',
                    'Authorization': 'Basic ' + base64.encode(client_id + ":" + client_secret)
                }
            })
        return Promise.resolve(response.data);
    } catch (err) {
        return Promise.reject(error);
    }
};

getToken()
    .then(data => {
        console.log(JSON.stringify(data, null, 4))
    })
    .catch(error => {
        console.log(error.message);
    });

结果

相关问题