Python 在Django中如何处理spotify api身份验证重定向uri?

Python 在Django中如何处理spotify api身份验证重定向uri?,python,ajax,django,oauth,spotipy,Python,Ajax,Django,Oauth,Spotipy,我在Django中构建了一个应用程序,它使用Spotify API Python库Spotipy,并使用Spotipy.util.prompt_for_user_token()命令生成令牌并访问我的私有库: import spotipy import spotipy.util as util import os, ast #Spotify API keys scope = "playlist-read-private" uir = "http://localhost:8000" usernam

我在Django中构建了一个应用程序,它使用Spotify API Python库Spotipy,并使用
Spotipy.util.prompt_for_user_token()
命令生成令牌并访问我的私有库:

import spotipy
import spotipy.util as util
import os, ast

#Spotify API keys
scope = "playlist-read-private"
uir = "http://localhost:8000"
username = "<MY_USERNAME>"

spotify_uid = os.environ["SPOTIFY_UID"]
spotify_usec = os.environ["SPOTIFY_USEC"]
print "retrieved keys from OS"

#set up access
def get_access():
  try:
    token = util.prompt_for_user_token(username, scope, spotify_uid, spotify_usec, uir)
    print "SUCCESS"
    return spotipy.Spotify(auth=token)
  except:
    print "FAILED TO LOAD"
导入spotipy
将spotipy.util作为util导入
导入操作系统,ast
#SpotifyAPI密钥
scope=“播放列表读取专用”
uir=”http://localhost:8000"
username=“”
spotify\u uid=os.environ[“spotify\u uid”]
spotify_usec=os.environ[“spotify_usec”]
打印“从操作系统检索到的密钥”
#设置访问权限
def get_access():
尝试:
token=util.prompt\u输入用户令牌(用户名、作用域、spotify\u uid、spotify\u usec、uir)
打印“成功”
返回spotipy.Spotify(auth=token)
除:
打印“加载失败”
我希望应用程序有一个用户界面登录,而不是硬编码登录,但我不知道如何

目前,我有一个“login”按钮,它试图通过Javascript触发登录页面重定向,方法是使用用户名参数调用上述代码,但这会打开一个新页面,控制台中有以下内容:

User authentication requires interaction with your
        web browser. Once you enter your credentials and
        give authorization, you will be redirected to
        a url.  Paste that url you were directed to to
        complete the authorization.


Opening https://accounts.spotify.com/authorize?scope=playlist-read-     private&redirect_uri=http%3A%2F%2Flocalhost%3A8000&response_type=code&client_id=<CLIENT_ID> in your browser


Enter the URL you were redirected to: [30/Jun/2016 15:53:54] "GET /?code=<TOKEN>HTTP/1.1" 200 2881 
用户身份验证需要与您的
网络浏览器。一旦您输入您的凭据和
给予授权,您将被重定向到
一个网址。粘贴您被定向到的url
完成授权。
开放https://accounts.spotify.com/authorize?scope=playlist-在浏览器中读取-private&redirect\u uri=http%3A%2F%2folocalhost%3A8000&response\u type=code&client\u id=
输入重定向到的URL:[30/Jun/2016 15:53:54]“GET/?code=HTTP/1.1”200 2881
注意:克拉括号中的文本已被替换,因为它们是私钥

我希望它具有类似于此网站处理登录的功能:

为了实现这一点,我最终放弃了spotipy模块,只使用javascript。我看到您正在使用用户授权api流,这很好,因为您的服务器可以安全地发送您的密钥。将其移动到应用程序前端时,您不能这样做,而是必须使用流:

当该页面加载时,在弹出窗口中,其URI将包含您寻求的授权,例:
http://www.example.com/callback/#access_token=BQDoPzyrkeWu7xJegj3v1JDgQXWzxQk2lgXrQYonXkXIrhmjeJVS38PFthMtffwlkeWJlwejkwewlHaIaOmth_2UJ2xJrz2x-Voq0k0T0T4SuCUdIGY3w3cj5CpULkFla9zwKKjvdauM2KoUIQa1vULz-w8Da83x1&token_type=Bearer&expires_in=3600&state=123

Idk,如果您使用或不使用jquery,但是有很多方法可以在页面加载时调用JS函数。因此,现在您需要做的就是在加载回调页面后解析URI,然后您就可以获得访问令牌了。然后您就完成了这个弹出回调窗口,这样您就可以通过将访问令牌添加到本地存储将其传递回主页面。还记得我们是如何在主页上创建一个事件侦听器来监视localStorage的,这样您就可以知道它何时出现了。下面是一个您希望在回调页面上使用的代码示例(它使用一些jquery,但在页面加载时有常规的JS方式):

#在spotifyLoginFinish.html中:
$('document').ready(函数(){
//我将“parseHash()”留给读者作为练习,它所做的只是获取uri字符串(参见上面的示例),并从中获取访问令牌
var spotifyAccessToken=parseHash(字符串(window.location.hash));
//必须清除localStorage,主页侦听器才能在所有(包括重复)条目上触发
localStorage.clear();
setItem('accessToken',spotifyAccessToken);
window.close();
});

现在,您的弹出窗口自动关闭,您回到了主窗口中,在本文第一段代码中的localStorage事件侦听器函数中。它将从localStorage中获取令牌,您就一切就绪了!希望这能有所帮助,如果不起作用,请发表评论。

您找到解决方案了吗?您好!您得到一个建议,在获取存储中的访问令牌集后,如何搜索歌曲?我有一个搜索功能,当我单击“搜索”按钮时会运行该功能。我是否只是复制并粘贴到上面写着“//使用您的访问令牌在此处使用spotify API做事!!”?我对学习如何使用这部分代码特别感兴趣,因为我已经能够获得存储在localstorage中的访问令牌。我只是不知道该怎么做:
window.addEventListener(“存储”,函数(事件){if(event.key==“accessToken”){var-spAccessToken=event.newValue;//在这里使用您的访问令牌使用spotify API做事情!!}}})
@user2030942一旦您有了访问令牌,您需要参考Spotify Api文档并查看各种可用的端点。如果您试图搜索一首歌曲,可能需要的端点是搜索:您将向该端点发送GET请求。您的请求将在其标头中包含您的令牌,并在URL中包含搜索参数。文档将告诉您可以期望返回哪种响应格式。文档中有代码示例,但如果不够,请发布一个新问题并链接到此处,我将尝试回答。
#In your main page's <script>:
var loginSpotify = function(){
        var SPOTIPY_CLIENT_ID = "Your Client ID Here"
        var SPOTIPY_REDIRECT_URI = "Your Django Callback View Here (www.example.com/callback/)"
        var spotifyScope = "playlist-read-private"
        var spotifyAuthEndpoint = "https://accounts.spotify.com/authorize?"+"client_id="+SPOTIPY_CLIENT_ID+"&redirect_uri="+SPOTIPY_REDIRECT_URI+"&scope="+spotifyScope+"&response_type=token&state=123";
        window.open(spotifyAuthEndpoint,'callBackWindow','height=500,width=400');
        //This event listener will trigger once your callback page adds the token to localStorage
        window.addEventListener("storage",function(event){
            if (event.key == "accessToken"){
                var spAccessToken = event.newValue;
                //do things with spotify API using your access token here!!
            }
        });
    }
#in your views.py:
def callback(request):
    return render(request, 'YourApp/spotifyLoginFinish.html',{})
#In spotifyLoginFinish.html's <script>:
$('document').ready(function(){
        //i leave 'parseHash()' as an exercise for the reader, all it does is take the uri string(see above ex of what this looks like) and get the access_token from it
        var spotifyAccessToken = parseHash(String(window.location.hash));
        //you must clear localStorage for main page listener to trigger on all(including duplicate) entries
        localStorage.clear();
        localStorage.setItem('accessToken', spotifyAccessToken);
        window.close();
});