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

Spotify API -在授权过程中检索访问令牌时出错

汪阳辉
2023-03-14

我正在开发我的第一个Spotify应用程序,现在我正在处理授权过程。

到目前为止,我已经成功地从https://accounts.spotify.com/authorize

现在我通过PHP CURL request发送一个POST请求来获取我的访问令牌。

Spotify对此步骤的说明

我不断收到以下 JSON 错误响应,指示我的grant_type无效,它为我提供了三个有效的选项:

{"error":"unsupported_grant_type","error_description":"grant_type必须是client_credentials、authorization_code或refresh_token"}bool(true)

如果你看看下面的代码,我相信我已经设置了正确的“authorization_code”grant_type,但我得到了错误。我用“******”突出显示了我认为是正确的代码行的代码片段。

有人能看出我做错了什么吗?以下是我用于发送请求的代码:

    //  Get access tokens
        $ch = curl_init();              
        // Specify the HTTP headers to send.
                //Authorization: Basic <base64 encoded client_id:client_secret>
                $ClientIDSpotify = "[my spotify app id]";
                $ClientSecretSpotify = "[my secret code]";
                $authorization = base64_encode ( "{$ClientIDSpotify}:{$ClientSecretSpotify}" );
                $http_headers = array( 
                            "Authorization: Basic {$authorization}"
                        );
                curl_setopt( $ch, CURLOPT_HTTPHEADER, $http_headers );
        curl_setopt( $ch, CURLOPT_POST, true);

        $spotify_url = "https://accounts.spotify.com/api/token";
        curl_setopt( $ch, CURLOPT_URL, $spotify_url );



        // *************************************************
        // HERE'S WHERE I CORRECTLY SPECIFY THE GRANT TYPE
        // *************************************************
        $data['grant_type'] = "authorization_code";
        $data['code'] = $authorizationCode;
        $callbackURL = "[my callback URL]";     
        $data['redirect_uri'] = $callbackURL;    

        curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
        $response_json = curl_exec( $ch );
        curl_close( $ch );
    }

共有3个答案

班承恩
2023-03-14

好的,所以我做了一点挖掘,在PHP CURL手册注释部分找到了一些代码。Spotify留档的问题是它没有指定要发送的POST数据的格式。我认为既然Spotify向我发送JSON数据,我也应该以JSON格式发送我的数据。所以我这样格式化POST数据:

        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));

看完一些留档后,我决定试试这个:

        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));

我得到了我需要的结果:

        {"access_token":"[long access token]","token_type":"Bearer","expires_in":3600,"refresh_token":"[long refresh token]"}

谢谢你,迈克尔,试图协助!

养慈
2023-03-14

在我看来,POST正文的格式不正确,其他一切看起来都很好。

我对PHP的有限理解告诉我,您的POST主体看起来像

{ “字段” : { “代码” : $authorizationCode, “grant_type” : “authorization_code”, “redirect_uri” : “http://www.example.com/spotify/callback/index.php” } } }

当然,您想发送的只是

{"code":$AuthizationCode,"grant_type":"authorization_code","redirect_uri":"http://www.example.com/spotify/callback/index.php " }

因此,尝试将$data对象设置为

$data['grant_type']="authorization_code";$data['code']=$AuthizationCode;$data['redirect_uri']=$call backURL;

或者甚至更短

$data=数组(“grant_type”=

希望这有帮助!

夹谷星剑
2023-03-14

正如关于切换到< code>http_build_query的最后一条评论的注释,我必须< code>URLDECODE数据,以便Spotify识别它。请尝试使用此行。

curl_setopt($ch, CURLOPT_POSTFIELDS, urldecode(http_build_query($data)));
 类似资料:
  • 我想避开keycloak登录页面。我将这个“避免keycloak默认登录页面和使用项目登录页面”链接引用到“http://localhost:5555/auth/realms/master/protocol/openid-connect/token”链接,并能够使用post方法获得访问令牌。 在此步骤中获得访问令牌后,提到要传递以下头部 标题:{ 但是不清楚将访问令牌传递到哪里,响应是什么,请求类

  • 我试图使用以下所需信息从API生成访问令牌: 授权endpoint:https://api.paylocity.com/identityserver/connect/token 其他值请求必须在请求正文中发布以下表单编码值: grant_type=client_credentials范围=WebLinkAPI 我尝试使用Python'requests'包,但没有成功,请参见下面: 我已经验证了我的

  • 对于工作,我正在处理一个Java项目,我们需要将授权令牌传递给每个请求标头。 在我的文件中,我有以下内容: 这将启用一个”按钮,我可以单击该按钮: ...这会将令牌插入到每个请求的标头中。 然而,在Swagger文档或其他地方的示例中没有任何关于如何自动插入auth令牌的文档。目标是通过调用内部API(使用active directory进行身份验证)来检索身份验证令牌,并将该令牌自动应用于请求头

  • 我想要一些关于如何在隐式授予流中使用ID令牌和访问令牌的澄清。我有一个使用msal.js for Angular包的Angular SPA和一个Web API。API不调用任何外部服务,如MSFT Graph。后端仅使用JWT中的角色声明来建立对API功能的RBAC授权。 这个文档写着:https://docs.microsoft.com/en-us/azure/active-directory/

  • 我们正在尝试将DocuSign与我们的产品集成。 我们的场景:我们的组织有一个(合作伙伴)帐户。我们创建了一个集成密钥(ClientID)和Secret。我们希望我们的客户使用他们自己的帐户(不是我们合作伙伴帐户的子帐户(管理员-用户关系))创建信封,并生成签名URL以及我们的集成商密钥和机密。 以下步骤: 创建了一个帐户(合作伙伴帐户) 问题:是否可以将一个帐户的集成商密钥和密码与另一个帐户(两

  • 我遇到了使用文档签名 API 的第一个障碍,需要一些帮助。 我将docusignrestapi集合导入到Postman中。我设置了iKey、iSec、encodedKeys和codeFromUrl变量。 当尝试发送'01-授权代码授予访问令牌'post API时,我每次都得到以下响应。 我尝试从Postman中删除所有内容,包括环境,并从DocuSign中删除该应用程序,然后重新开始,以便我的所有