Spotify 授权登录调用错误的 url

Posted

技术标签:

【中文标题】Spotify 授权登录调用错误的 url【英文标题】:Spotify authorization login call in wrong url 【发布时间】:2019-11-01 12:51:46 【问题描述】:

我正在开发一个简单的网络应用程序来显示我当前正在播放的歌曲。我已经设置了一个 Spotify 帐户,并收到了一个 clientId 和客户端密码。 我尝试请求初始令牌,以便与 spotify api 进行进一步通信。

我正在显示收到的登录 html,我尝试登录,但没有任何反应,它只是在登录表单上方显示“出现问题......”。此时,我检查了 spotify 仪表板并将所有本地回调 url 列入白名单,但我仍然收到此消息,但没有发生任何事情。 我检查了浏览器开发工具并看到了一些奇怪的东西(至少我相信它很奇怪)。 登录调用重定向到“https://losthost:5001/api/login”,导致 404。

public async Task<IActionResult> Connect()

    var client = new HttpClient();
    var clientId = "clientId";

    var redirectUrl = HttpUtility.UrlEncode("http://localhost:5000/Spotify/Callback/");
    var url = $"client_Id=clientId&response_type=code&redirect_uri=redirectUrl";

    var result = await client.GetAsync($"https://accounts.spotify.com/authorize?url");

    if (result.Content.Headers.ContentType.MediaType == "text/html")
        var spotifyLoginHtml = await result.Content.ReadAsStringAsync();

        return new ContentResult()
        
            Content = spotifyLoginHtml,
            ContentType = "text/html",
        ;
    
    else
    
        //var accessToken = await result.Content.ReadAsStringAsync();
        //return RedirectToAction("DevicesSelection");
       

    return View();         

我认为我的问题是来自 spotify 登录 html 的错误登录调用,但我不知道为什么会发生这种情况或如何解决它。

编辑: 添加了初始错误的图像(未捕获的承诺)和错误的 api/login 调用

【问题讨论】:

【参考方案1】:

redirect_uri

用户授予或拒绝权限后重定向到的 URI。此 URI 需要已输入到您在注册应用程序时指定的重定向 URI 白名单中。这里的redirect_uri的值必须与你注册应用时输入的值之一完全匹配,包括大写或小写、终止斜线等。

Spotify 提供的article available 涵盖了身份验证和授权设置以及分步流程。

如果http://localhost:5000/Spotify/Callback/ 是您的重定向网址,您应该首先将网址添加到仪表板中的重定向URI 白名单:

在您的应用程序中,您应该有路由匹配 http://localhost:5000/Spotify/Callback/ 以通过查询字符串获取代码,然后使用代码获取访问令牌以访问 Spotify API。这是一个代码示例:

class SpotifyAuthentication

    public string clientID = "xxxxxxxxxxxxxxxxxxxxx";
    public string clientSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    public string redirectURL = "https://localhost:44363/callback";


public class HomeController : Controller

    SpotifyAuthentication sAuth = new SpotifyAuthentication();

    [HttpGet]
    public ContentResult Get()
    
        var qb = new QueryBuilder();
        qb.Add("response_type", "code");
        qb.Add("client_id", sAuth.clientID);
        qb.Add("scope", "user-read-private user-read-email");
        qb.Add("redirect_uri", sAuth.redirectURL);

        return new ContentResult
        
            ContentType = "text/html",
            Content = @"
                <!DOCTYPE html>
                <html>
                    <head>
                        <meta charset=""utf-8"">
                        <title>Spotify Auth Example</title>
                    </head>
                    <body>
                        <a href=""https://accounts.spotify.com/authorize/" + qb.ToQueryString().ToString() + @"""><button>Authenticate at Spotify</button></a>
                    </body>
                </html>
            "
        ;
    

    [Route("/callback")]
    public ContentResult Get(string code)
    
        string responseString = "";

        if (code.Length > 0)
        
            using (HttpClient client = new HttpClient())
            
                Console.WriteLine(Environment.NewLine + "Your basic bearer: " + Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(sAuth.clientID + ":" + sAuth.clientSecret)));
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(sAuth.clientID + ":" + sAuth.clientSecret)));

                FormUrlEncodedContent formContent = new FormUrlEncodedContent(new[]
                
                    new KeyValuePair<string, string>("code", code),
                    new KeyValuePair<string, string>("redirect_uri", sAuth.redirectURL),
                    new KeyValuePair<string, string>("grant_type", "authorization_code"),
                );

                var response = client.PostAsync("https://accounts.spotify.com/api/token", formContent).Result;

                var responseContent = response.Content;
                responseString = responseContent.ReadAsStringAsync().Result;
            
        

        return new ContentResult
        
            ContentType = "application/json",
            Content = responseString
        ;
    

代码参考:https://github.com/bmsimons/dotnet-core-spotify-authentication 和 blog。

当然你也可以使用 Spotify 中间件,here 是一个代码示例。

【讨论】:

感谢您的回复,我尝试了您的代码,它有效,谢谢。我想我理解这个问题,我无法在我的应用程序中显示 spotify html 代码,它必须是用户点击的链接,我认为我可以处理我网站上的整个登录,这似乎是错误的。

以上是关于Spotify 授权登录调用错误的 url的主要内容,如果未能解决你的问题,请参考以下文章

Spotify API 授权错误 (Swift)

Spotify 令牌调用后返回错误网站而不是错误或令牌

Spotify Web API 授权错误

Spotify:使用不接受重定向 url 的 web api 登录

python 上的 Spotify API 授权错误

Spotify API 授权代码流向我返回 400 错误请求