ERR_ABORTED 403(禁止)

ERR_ABORTED 403 (Forbidden)

我正在尝试构建一个可以控制我的 Sonos 扬声器的程序。我正在按照 https://developer.sonos.com/build/direct-control/authorize/.

上的说明进行操作

第一步 - 获取授权码 - 正在按预期工作,但是当我尝试使用以下代码按 POST 请求发送授权码时,我遇到了问题:

const redirect_uri = "https%3A%2F%2Fsonoscontrol-c4af4.web.app%2F";
const redirect_url = "https://sonoscontrol-c4af4.web.app/";
const client_id =  // API Key (deleted value for safety)
const secret =     // Secret (deleted value for safety)
const auth_url = `https://api.sonos.com/login/v3/oauth?client_id=${client_id}&response_type=code&state=testState&scope=playback-control-all&redirect_uri=${redirect_uri}`;

function GetAccessToken() {
    var target_url = "https://api.sonos.com/login/v3/oauth/access/";
    var authCode = GetAuthCode();
    var encoded_msg = btoa(client_id + ":" + secret); // base64-encodes client_id and secret using semicolon as delimiter
    
    var params = "grant_type=authorization_code" + `&code=${authCode}` + `&redirect_uri=${redirect_uri}` + `&client_id=${client_id}`;

    var myHeaders = new Headers({
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Methods': 'POST',
        'Authentication': `Basic {${encoded_msg}}`,
        'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
    });
    
    fetch(target_url, {
        method: "POST",
        mode: "no-cors",
        credentials: "include",
        redirect: "follow",
        headers: myHeaders,
        body: params
    }).then((res) => {
        console.log(res.responseText);
    }).catch(function(error) {
        console.log(error);
    });
}
function GetAuthCode() {
    return (new URLSearchParams(location.search)).get('code');  // returns authorization code from URL
}

现在我在尝试发送 POST 请求时收到以下错误:POST https://api.sonos.com/login/v3/oauth/access/ net::ERR_ABORTED 403 (Forbidden)

我正在使用 Cloud Firebase 应用作为网络服务器,并在凭据中添加了正确的重定向 URL。

此错误消息可能是什么问题?

我注意到您的代码中有几处可能导致您的 403 Forbidden 问题。

  1. 您的“身份验证”header 应该是“授权”,例如:“授权:基本 {YourBase64EncodedClientId:SecretGoesHere}”
  2. 您的“target_url”结尾有一个斜线,应该是“https://api.sonos.com/login/v3/oauth/access”
  3. 您的查询参数“params”包括令牌请求中的 client_id,这不是必需的,但我认为它不会导致错误。

解决上述问题有望解决您的问题!

谢谢,

-马克