PHP 中的 Spotify API 身份验证 - 重定向 URI 无效

Posted

技术标签:

【中文标题】PHP 中的 Spotify API 身份验证 - 重定向 URI 无效【英文标题】:Spotify API auth in PHP - Invalid redirect URI 【发布时间】:2020-02-17 21:51:46 【问题描述】:

我正在尝试连接到 Spotify API。

我通过以下方式获得授权码:

<?php
$redirect_uri = 'http%3A%2F%2Flocalhost%3A8000';
?>
<a href="https://accounts.spotify.com/authorize?client_id=<?php echo $client_id;?>&response_type=code&redirect_uri=<?php echo $redirect_uri; ?>&scope=user-read-private%20user-read-email&state=34fFs29kd09">Get code</a><br/><br/>

到目前为止一切顺利,我得到了代码。然后我尝试用以下方式交换令牌:

$redirect_uri = 'http%3A%2F%2Flocalhost%3A8000';
$url = 'https://accounts.spotify.com/api/token';
$fields = [
  'grant_type' => 'authorization_code',
  'code' => $code,
  'redirect_uri' => $redirect_uri,
  'client_id' => $client_id,
  'secret' =>   $secret
];
$fields_string = http_build_query($fields);
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, true);
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
$result = curl_exec($ch);

我在 Spotify 控制面板中将http://localhost:8000 的所有变体都列入了白名单:

但我收到此错误:

result: "error":"invalid_grant","error_description":"Invalid redirect URI"

编辑:奇怪的是我可以使用重定向 URI http:%2F%2Flocalhost%3A8000 成功链接到隐式授权客户端方法 - 所以我知道这已正确列入白名单。我在上面发布的代码中使用了这个 URI,得到了同样的错误。我还使用了我能想到的所有其他组合,无论是使用:%2F%2F、%3A%2F%2F、斜杠、%3A 等。每次都出现同样的错误!

有什么想法吗?

edit2:如果我使用 $redirect_uri = 'http://localhost:8000';我得到一个不同的错误:

result: "error":"invalid_request","error_description":""

【问题讨论】:

你试过不带端口吗? 是的,如果代码中有非法重定向uri,只是将其添加到白名单中没有效果。 发现一个可能重复的问题here 我想 $redirect_uri 应该是未编码的形式,即$redirect_uri = 'http://localhost:8000'; http_build_query 应该为你编码。 确实不应该在用法中对 URI 进行编码 【参考方案1】:

现在您已经停止对 redirect_uri 进行编码,它抱怨参数无效。

根据文档,client_id 和 secret 不会与其他参数一起发送,它们需要通过 Authorization 标头添加到标头中:

https://developer.spotify.com/documentation/general/guides/authorization-guide/#2-have-your-application-request-refresh-and-access-tokens-spotify-returns-access-and-refresh-tokens

标题参数 授权 包含客户端 ID 和客户端密钥的 Base 64 编码字符串。 该字段必须具有以下格式: 授权:基本

【讨论】:

宾果游戏谢谢!您的建议确实解决了问题 - 但是对于未来的读者,我将添加以下内容 - 您实际上可以发送 client_id 和 secret 以及其他参数,文档指出:“发送客户端 id 和 secret 的另一种方法是POST 正文中的请求参数(client_id 和 client_secret),而不是在标头中发送 base64 编码的参数。”我的错误是我在帖子正文中将其作为“秘密”而不是“client_secret”发送。哇!

以上是关于PHP 中的 Spotify API 身份验证 - 重定向 URI 无效的主要内容,如果未能解决你的问题,请参考以下文章

我该如何处理 Django 中的 spotify api 身份验证重定向 uri?

Spotify 身份验证流程 (Spotify API)

如何在我当前使用 Spotify Search API 的代码上应用 Spotify API 身份验证?

Spotify API 错误 400:“仅支持有效的不记名身份验证”

在使用 spotify api 进行用户身份验证后管理 spotify 订阅(取消、升级)

即使在添加身份验证令牌以获取艺术家的播放列表后,Spotify API 也会出现 CORS 错误